2012-04-17 1 views
0

내 프로그램 "./myprog"의 전체 추적 목록을 가져오고 싶습니다. - GDB 7.0- 우분투 (내 아키텍처에 대한 최신 버전이 존재하지 않습니다)가 있습니다. 내 GDB 스크립트 ("./trace_list.gdb은") :GDB의 도움으로 프로그램의 전체 추적 목록을 얻는 방법은 무엇입니까?

gdb -q -x ./trace_list.gdb 


file ./myprog 
set print address off 
display/x $r0 
display/x $r1 
display/x $r2 
display/x $r3 
display/x $r4 
display/x $r5 
display/x $r6 
display/x $r7 
display/x $r8 
display/x $r9 
display/x $r10 
display/x $r11 
display/x $r12 
display/x $sp 
display/x $lr 
display/x $fps 
b *0x323d0 
set logging on 
run 
while 1 
x/i $pc 
ni 
end 
quit 

는 특정 순간을 위해 좋은 작동합니다. 다음 글을 참고하십시오 :

"./trace_list.gdb":26: Error in sourced command file: 
Cannot access memory at address 0x6b980000 

그리고 더 이상 실행되지 않습니다.

왜이 오류가 발생합니까? 내 프로그램의 전체 추적 목록을 가져 오려면 어떻게해야합니까? 다른 도구를 사용해야 할 수도 있습니까? 나는 전혀 모른다.

답변

1

주소 0x6b980000의 메모리에 액세스 할 수 없습니다. 이 오류가 발생하는 이유는 무엇입니까?

오류는 GDB가 0x6b980000에서 메모리에 액세스하려고했지만 할 수 없었다 (이 ;-)

대부분의 경우 귀하의 타겟 프로세서 (이이 프로세서?) 하나의 하드웨어를 많이 부족 있다고 말했다 것을 의미한다 -step (또는 GDB는 그것을 사용하는 방법을 모른다), 따라서 ni을 수행하기 위해서, GDB는 다음 명령어라고 생각하는 것에 임시 브레이크 포인트를 설정한다. GDB가 실수를하거나 GDB가 쓸 수없는 메모리 (예 : 커널의 일부)에 명령어가있는 경우 잃게됩니다.

내 프로그램의 전체 추적 목록을 얻으려면 어떻게해야합니까?

전체 트레이스는 실제로는 거의 유용하지 않습니다. 명령어가 너무 많아서 단일 단계 오버 헤드가 너무 많습니다. 아마도이 방법을 포기하고 대신 divide-and-conquer debugging을 사용해야할까요?

업데이트 :

"전체 추적이 실제로 매우 드물게 유용 없다"- 프로그램이 난독 경우에도?

예, 특히 프로그램이 난독 화 된 경우

프로그램은 안티 디버깅 기술도 사용할 수 있습니다. 디버거에서 다르게 동작하는 프로그램을 만드는 것은 매우 간단하며 실제 프로그램 작업과 관련이없는 전체 추적을 보는 데 몇 시간을 소비 할 수 있습니다.

if (running_under_debugger()) { 
    compute_one_million_digits_of_pi(); 
} else { 
    do_something_useful(); 
} 
+0

"전체 추적은 실제로 거의 유용하지 않습니다."- 프로그램이 난독 화 된 경우에도? –

+0

일부 중단 점 사이에 프로그램 추적을 얻는 것이 유용 할 것입니다. 그러나 키보드를 깨고 모니터를 창 밖으로 던질 때마다 "주소의 메모리에 액세스 할 수 없습니다"라는 메시지가 나타납니다. 추신 프로그램은 기호 정보없이 정적으로 (gcc - 정적으로) 어셈블됩니다. –

+0

감사합니다. :) –

관련 문제