2014-02-07 4 views
10

프로그램에서 일부 핫스팟의 정확한 시작 위치를 x86 머신 명령어 카운트로 추정해야합니다 (나중에 일부 에뮬레이터/시뮬레이터에서 실행될 수 있도록). 중단 점까지 실행되는 기계 명령어의 수를 세는 gdb를 사용하는 방법이 있습니까?gdb를 사용하여 머신 계산 방법 계산

물론 다른 대안이 있습니다. 핀과 같은 에뮬레이션/바이너리 계측 도구를 사용하고 명령어를 계산하는 동안 실행을 추적 할 수는 있지만 작업 할 모든 플랫폼에이 도구를 설치해야합니다. . 나는 거의 모든 리눅스 머신에서 사용할 수있는 도구가 필요하다.

gdb를 사용하면 큰 진보에 대해 큰 진보에 대해 실행할 수 있다고 생각합니다. 중단 점에 도달 할 때까지 거친 검색을 수행 한 다음 해상도를 줄이면 반복되지만 엄청나게 느립니다. 이것을 할 또 다른 방법이 있습니까?

+0

GDB는이 목적에 완전히 부적합합니다. 응용 프로그램의 성능을 정확하게 측정하려면 [PAPI] (http://icl.cs.utk.edu/papi/)와 같은 것을 사용하십시오. 어쨌든 에디터가있는 곳이라면 계측 툴을 사용해야합니다. –

+0

@mfukar 감사합니다. 그러나 GDB와 같이 어디에서나 쉽게 구할 수 있는지 확신 할 수 없습니다. 또한 GDB가 완전히 부적절하다고 말하지는 않을 것입니다. 추가하는 것은 아주 간단한 기능입니다. 이미 기계 inst 해결책으로 단계를 수행하는 방법을 알고 있습니다. 필요한 것은 어딘가에서 명령 수를 추적하는 것입니다. – Leeor

+0

디버거의 프로그램을 'ptrace'하면 성능 (캐시 상태, TLB 누락 등)에 중요한 프로그램 상태가 변경됩니다. 디버거에서 프로그램을 실행하는 동안 얻을 수있는 결과는 해당 상황에서만 적용됩니다. –

답변

13

이 시도 :

set pagination off 
set $count=0 
while ($pc != 0xyourstoppingaddress) 
stepi 
set $count=1+$count 
end 
print $count 

그런 다음 한 잔의 커피를 얻을 이동합니다. 아니면 긴 점심.

+1

잘 작동합니다. 거기에'start'를 추가해야했습니다. 내 긴 점심 먹으러 왔어. 고마워! :) – Leeor

+0

그리고 끝났다 (실행, 점심이 아니다). ~ 1.2k insts/sec - 느리지 만 대체 옵션으로 나쁘지는 않습니다. – Leeor

3

이것은 실제로 Mark의 솔루션의 유용성을 약간 향상시킨 것입니다.

우리는 함수 do_count 정의 할 수 있습니다

:

define do_count 
set $count=0 
while ($pc != $arg0) 
stepi 
set $count=$count+1 
end 
print $count 
end 

다음이 기능은 반복해서 단계의 수를 계산에 재사용 할 수 있습니다

set pagination off 
do_count 0xaddress1 
do_count 0xaddress2 

한도에이 정의를 넣을 수 있습니다 .gdbinit (Linux에서는 Windows의 경우 gdb.ini이라고 부름)을 gdb가 시작된 후 자동으로 사용 가능하게 설정합니다 (기능이로드되었는지 여부를 확인하려면 show user을 사용하십시오).