2010-01-29 15 views
5

GDB可以像使用傳統裝配監視器一樣使用嗎?使用gdb作爲監視器?

只要你進入eg。庫中的代碼返回:

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>刪除它們)。例如,看會發生什麼情況%eax

(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的變化可以看出:

(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 2010-01-31 02:42:48