2011-10-03 24 views
17

Tôi đang sử dụng trình kiểm tra heap của google để theo dõi rò rỉ bộ nhớ. Nó cho tôi một dấu vết ngăn xếp như:Cách sử dụng GDB để tìm địa chỉ bộ nhớ nào tương ứng với

Leak of 21 bytes in 1 objects allocated from:                                        
    @ 0xf6088241                                                
    @ 0xf60890d2                                                
    @ 0xf6089246                                                
    @ 0x8054781                                                 
    @ 0x8054862                                                 
    @ 0xf684ee76                                                
    @ 0xf684f343                                                
    @ 0x804be4c                                                 
    @ 0x80544f6                                                 
    @ 0xf5e52bb6                                                
    @ 0x804b101 

Làm cách nào để xác định những chức năng/dòng mã nào địa chỉ bộ nhớ tương ứng với?

+3

Tôi ngạc nhiên khi trình kiểm tra heap của Google không thực hiện chuyển đổi này cho bạn. Bạn có chắc là bạn đã biên dịch bằng "-g" không? (Ngoài ra, hãy xem [lệnh addr2line] (http://sourceware.org/binutils/docs/binutils/addr2line.html)) – Nemo

+0

Bất kỳ câu hỏi kiểu biểu tượng nào: http://stackoverflow.com/questions/762628/ gdb-getting-a-symbol-name-from-a-memory-address –

Trả lời

33

Sử dụng lệnh info symbol gdb. 16 Examining the Symbol Table.

info symbol addr 
Print the name of a symbol which is stored at the address addr. If no symbol is stored exactly at addr, gdb prints the nearest symbol and an offset from it: 
      (gdb) info symbol 0x54320 
      _initialize_vx + 396 in section .text 

This is the opposite of the info address command. You can use it to find out the name of a variable or a function given its address. 

For dynamically linked executables, the name of executable or shared library containing the symbol is also printed: 

      (gdb) info symbol 0x400225 
      _start + 5 in section .text of /tmp/a.out 
      (gdb) info symbol 0x2aaaac2811cf 
      __read_nocancel + 6 in section .text of /usr/lib64/libc.so.6 
+0

Vì vậy, sau khi tôi nhận được một danh sách các lệnh thông tin, và tìm ra rằng địa chỉ 'info address' không tra cứu, hóa ra cũng có một' thông tin lệnh symbol', không truy vấn biểu tượng. –

2

Giả nhị phân của bạn có thông tin debug g++ -g bạn có thể sử dụng x/ để có được những thông tin, tôi biết rằng làm việc cho vtables.

x/<num>xw để in <num> từ bộ nhớ hex và gdb sẽ chú thích phía bên trái với thông tin về địa chỉ ở đâu.

1

Các câu hỏi ban đầu hỏi làm thế nào để làm điều này trong GDB:

# NOT what you want; note the lack of '*': 
(gdb) info symbol 0xfde09edc 
blah() + 388 in section .text of /tmp/libblah.so 

# IS what you want; note the presence of '*': 
(gdb) info line *0xfde09edc 
Line 91 of "blah.cc" 
    starts at address 0xfde09ebc <blah()+356> 
    and ends at 0xfde09ee4 <blah()+396> 

Các * là cần thiết cho info line và không nên được sử dụng cho info symbol.

Bạn cũng có thể sử dụng lệnh disassemble với /m cờ của nó:

(gdb) disassemble /m 0xfde09edc 

... mặc dù nó khá dài dòng và info line cho chính xác những gì được yêu cầu.

+0

Xin lưu ý rằng công cụ sửa đổi '/ m' không được hỗ trợ cho'/s' (xuất hiện trong gdb 7.11). Dù sao, bạn có thể sử dụng đầu ra ít hơn nhiều chi tiết của 'x/i 0xfde09edc' thay vì tháo toàn bộ chức năng. – Ruslan

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