如何使用GDB查找内存地址对应的函数

Nat*_*ath 23 c++ gdb

我正在使用谷歌的堆检查器来追踪内存泄漏.它给了我一个堆栈跟踪,例如:

Leak of 21 bytes in 1 objects allocated from:                                                                                                                                                               
    @ 0xf6088241                                                                                                                                                                                               
    @ 0xf60890d2                                                                                                                                                                                               
    @ 0xf6089246                                                                                                                                                                                               
    @ 0x8054781                                                                                                                                                                                                
    @ 0x8054862                                                                                                                                                                                                
    @ 0xf684ee76                                                                                                                                                                                               
    @ 0xf684f343                                                                                                                                                                                               
    @ 0x804be4c                                                                                                                                                                                                
    @ 0x80544f6                                                                                                                                                                                                
    @ 0xf5e52bb6                                                                                                                                                                                               
    @ 0x804b101  
Run Code Online (Sandbox Code Playgroud)

如何确定这些内存地址对应的代码功能/行?

ks1*_*322 38

使用info symbolgdb命令.16检查符号表.

info symbol addr
Run Code Online (Sandbox Code Playgroud)

打印存储在地址地址中的符号名称.如果没有符号存储在addr中,gdb将打印最近的符号及其偏移量:

(gdb) info symbol 0x54320
_initialize_vx + 396 in section .text
Run Code Online (Sandbox Code Playgroud)

这与info address命令相反.您可以使用它来查找变量的名称或给定其地址的函数.

对于动态链接的可执行文件,还会打印包含该符号的可执行文件或共享库的名称:

(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
Run Code Online (Sandbox Code Playgroud)


Bri*_*erg 7

原始问题询问如何在 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>
Run Code Online (Sandbox Code Playgroud)

*是必要的info line,不应该被用于info symbol

您还可以使用disassemble带有/m标志的命令:

(gdb) disassemble /m 0xfde09edc
Run Code Online (Sandbox Code Playgroud)

...虽然它相当冗长,并info line给出了所要求的内容。

  • 请注意,`/m` 修饰符已被弃用,取而代之的是`/s`(出现在 gdb 7.11 中)。无论如何,您可以使用更简洁的 `x/i 0xfde09edc` 输出,而不是反汇编整个函数。 (2认同)