2010-01-29 8 views
5

GDB를 전통적인 어셈블리 모니터처럼 사용할 수 있습니까?gdb를 모니터로 사용 하시겠습니까?

예를 들어 들어서 자마자. 라이브러리 코드가 반환

No function contains program counter for selected frame 

GDB 알 수없는 코드지만 GDB의 작동이 중지 UI를 한 단계 씩 할 수있는 디버거.

이와 관련하여 question 제안 된 해결책을 찾을 수 있지만 어느 것도 만족스럽지 않습니다.

바이너리 라이브러리에 디버깅 기호 패키지가 없으면 어떻게해야합니까? 프로그램이 런타임 생성 코드로 점프하면 어떻게 될까요?

코드를 분해하는 것은 UI가 무시하기 때문에 실제로 해결책이 아니며 가장 중요한 점은 원래 알려진 코드로 돌아갈 때까지 레지스터 값이 업데이트되지 않는다는 것입니다. info registers이 작동하지만 이는 거의 상호 작용하지 않습니다.

의견이 있으십니까?

감사합니다.

답변

8

display 명령으로 이런 종류의 작업을 수행 할 수 있습니다.

display/i $pc 프롬프트 때마다 인쇄되기 직전에 현재 명령 분해됩니다

(gdb) b main 
Breakpoint 1 at 0x80483b5: file hw.c, line 5. 
(gdb) display/i $pc 
(gdb) r 
Starting program: /tmp/hw 

Breakpoint 1, main() at hw.c:5 
5   puts("Hello world"); 
1: x/i $pc 
0x80483b5 <main+17>: movl $0x8048490,(%esp) 

지금 명령 단계를 (그럼 그냥 반복 입력 타격 유지) : 여전히

(gdb) si 
0x080483bc  5   puts("Hello world"); 
1: x/i $pc 
0x80483bc <main+24>: call 0x80482d4 <[email protected]> 
(gdb) 
0x080482d4 in [email protected]() 
1: x/i $pc 
0x80482d4 <[email protected]>: jmp *0x804959c 
Current language: auto; currently asm 
(gdb) 
0x080482da in [email protected]() 
1: x/i $pc 
0x80482da <[email protected]+6>: push $0x10 
(gdb) 
0x080482df in [email protected]() 
1: x/i $pc 
0x80482df <[email protected]+11>:  jmp 0x80482a4 <_init+48> 

그것을 이 지점에 도달하면 작동합니다.

(gdb) 
0x080482a4 in ??() 
1: x/i $pc 
0x80482a4 <_init+48>: pushl 0x804958c 
(gdb) 
0x080482aa in ??() 
1: x/i $pc 
0x80482aa <_init+54>: jmp *0x8049590 
(gdb) 
0xb7f052d0 in _dl_runtime_resolve() from /lib/ld-linux.so.2 
1: x/i $pc 
0xb7f052d0 <_dl_runtime_resolve>:  push %eax 

두 개 이상의 display 표현식을 동시에 활성화 할 수 있습니다 (제거하려면 undisplay <number> 사용). 여기

(gdb) display/x $eax 
2: /x $eax = 0xbf90ab34 
(gdb) si 
0xb7f052d1 in _dl_runtime_resolve() from /lib/ld-linux.so.2 
2: /x $eax = 0xbf90ab34 
1: x/i $pc 
0xb7f052d1 <_dl_runtime_resolve+1>:  push %ecx 
(gdb) 
0xb7f052d2 in _dl_runtime_resolve() from /lib/ld-linux.so.2 
2: /x $eax = 0xbf90ab34 
1: x/i $pc 
0xb7f052d2 <_dl_runtime_resolve+2>:  push %edx 
(gdb) 
0xb7f052d3 in _dl_runtime_resolve() from /lib/ld-linux.so.2 
2: /x $eax = 0xbf90ab34 
1: x/i $pc 
0xb7f052d3 <_dl_runtime_resolve+3>:  mov 0x10(%esp),%edx 
(gdb) 
0xb7f052d7 in _dl_runtime_resolve() from /lib/ld-linux.so.2 
2: /x $eax = 0xbf90ab34 
1: x/i $pc 
0xb7f052d7 <_dl_runtime_resolve+7>:  mov 0xc(%esp),%eax 

... 그리고 %eax의 변화를 볼 수있다 : 예를 들어, %eax 어떻게되는지 볼 수있는 대안보다는

(gdb) 
0xb7f052db in _dl_runtime_resolve() from /lib/ld-linux.so.2 
2: /x $eax = 0xb7f0d668 
1: x/i $pc 
0xb7f052db <_dl_runtime_resolve+11>: call 0xb7eff780 <_dl_fixup> 
(gdb) 
+0

더 나은하지만 TUI에서 작동하지 않습니다 . 나는 실제 해결책이 없을 수도 있다는 것을 깨닫고 잠시 후에 이것을 받아 들일만한 대답으로 표시 할 것입니다. – jbcreix

관련 문제