2010-01-29 30 views
5

GDB có thể được sử dụng như thể nó là một màn hình lắp ráp truyền thống?Sử dụng gdb làm màn hình?

Ngay khi bạn bước vào ví dụ. mã thư viện nó sẽ trả về:

No function contains program counter for selected frame 

GDB debugger có thể bước vào mã không rõ nhưng GDB UI ngừng hoạt động.

Trong liên quan này question bạn có thể tìm thấy một cặp giải pháp được đề xuất nhưng không hoàn toàn thỏa mãn tôi.

Điều gì xảy ra nếu thư viện nhị phân không đi kèm với gói biểu tượng gỡ lỗi? Điều gì xảy ra nếu chương trình nhảy vào mã được tạo theo thời gian chạy?

Việc tháo rời mã không thực sự là giải pháp vì giao diện người dùng bỏ qua nó, quan trọng nhất là giá trị của thanh ghi không được cập nhật cho đến khi bạn quay lại mã đã biết ban đầu. info registers hoạt động, nhưng điều đó hầu như không tương tác.

Bất kỳ đề xuất nào?

Cảm ơn!

Trả lời

8

Bạn có thể thực hiện việc này bằng lệnh display.

display/i $pc sẽ tháo rời các hướng dẫn hiện ngay trước dấu nhắc được in mỗi lần:

(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) 

Bây giờ bước một lệnh (sau đó chỉ cần tiếp tục nhấn Enter để lặp lại):

(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> 

Nó vẫn hoạt động khi chúng tôi nhận được đến thời điểm này:

(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 

Nhiều hơn một biểu thức display có thể hoạt động cùng một lúc (sử dụng undisplay <number> để xóa chúng). Ví dụ, để xem những gì xảy ra với %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 

... và đây sự thay đổi trong %eax có thể được nhìn thấy:

(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

Tốt hơn so với giải pháp thay thế nhưng nó không hoạt động với TUI trên . Tôi vẫn sẽ đánh dấu đây là câu trả lời được chấp nhận sau một thời gian khi tôi nhận ra rằng có thể không có bất kỳ giải pháp thực sự nào. – jbcreix

Các vấn đề liên quan