2009-10-18 50 views
10

trong Linux và Mac OS X Tôi có thể sử dụng stepi và nexti để gỡ lỗi một ứng dụng mà không cần gỡ lỗi thông tin.Gỡ lỗi các thư viện đã tháo rời với gdb

Trên Mac OS X gdb hiển thị các hàm được gọi bên trong thư viện, mặc dù đôi khi tiến hành một số lệnh lắp ráp trong mỗi lệnh stepi.

Trên Linux, khi tôi bước vào thư viện động, gdb bị mất. Ví dụ, với puts() có ba hướng dẫn lắp ráp bên trong puts(), khi gdb đạt đến bước nhảy ở 0x080482bf, nó không thành công với thông báo "Không có hàm nào chứa bộ đếm chương trình cho khung đã chọn".

0x080482ba in [email protected]() 
(gdb) disassemble 
Dump of assembler code for function [email protected]: 
0x080482b4 <[email protected]+0>:  jmp *0x8049580 
0x080482ba <[email protected]+6>:  push $0x10 
0x080482bf <[email protected]+11>:  jmp 0x8048284 <_init+48> 
End of assembler dump. 
(gdb) stepi 
0x080482bf in [email protected]() 
(gdb) stepi 
0x08048284 in ??() 
(gdb) disassemble 
No function contains program counter for selected frame. 

Bạn có biết cách gỡ lỗi các cuộc gọi thư viện này với gdb không.

+0

Phiên bản gdb nào? –

+0

Ngoài ra, điều gì xảy ra khi bạn sử dụng stepi trên Linux? Bạn nói rằng bạn không thể bước qua các hướng dẫn ở tất cả, nhưng bạn không mô tả những gì thực sự xảy ra. Bạn có thể đăng một phiên mẫu không? –

+0

Cảm ơn bạn, tôi đang sử dụng Slackware 13.0 với gdb 6.8 được cài đặt trước của nó. Tôi đã làm rõ điều gì xảy ra. – Freeman

Trả lời

12

Nếu GDB không có biểu tượng gỡ lỗi cho hàm bạn đang cố gỡ lỗi, GDB sẽ không thể xác định phạm vi địa chỉ bộ nhớ cần tháo rời. Để giải quyết vấn đề này, bạn có thể chuyển phạm vi vào lệnh disassemble. Ví dụ:

(gdb) p $pc 
$4 = (void (*)()) 0x70c72d <_IO_puts+29> 
(gdb) disassemble 0x70c72d 0x70c740 
Dump of assembler code from 0x70c72d to 0x70c740: 
0x0070c72d <_IO_puts+29>: mov %eax,(%esp) 
0x0070c730 <_IO_puts+32>: call 0x721f10 <strlen> 
0x0070c735 <_IO_puts+37>: mov 0x84c(%ebx),%edx 
0x0070c73b <_IO_puts+43>: cmpw $0x0,(%edx) 
0x0070c73f <_IO_puts+47>: mov %edx,-0x10(%ebp) 
End of assembler dump. 

Có thể có cách cài đặt các biểu tượng gỡ lỗi. Trên hệ thống Ubuntu của tôi, tôi đã cài đặt gói libc6-dbg, cho phép tôi thực hiện các chức năng trong thư viện chuẩn.

+3

GNU gdb (GDB) 7.4.1-debian. Cú pháp chính xác bây giờ là 'tháo rời 0x70c72d, 0x70c740'. Đó là phải có dấu phẩy. – golem

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