如何在GDB中获取内存地址的符号名称?

时间:2009-04-18 00:27:40

标签: debugging memory gdb

例如,我知道0x46767f0属于NSString *,有什么方法可以找出NSString是什么来帮助我找到一些我想要的错误?

5 个答案:

答案 0 :(得分:50)

我相信你在寻找:

info symbol <addresss>

打印存储在地址地址中的符号名称。如果没有符号完全存储在addr中,GDB将打印最近的符号及其偏移量。

示例:

(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

您可以详细了解here

答案 1 :(得分:12)

GDB&GT; list * 0xAABBCCDD

告诉你文件名和行号。

答案 2 :(得分:3)

如果它是一个堆栈变量,我无法做到这一点。否则,请尝试p/a <pointer symbol or address>,它将打印符号名称(或偏移到最近的符号名称)。

答案 3 :(得分:3)

po 0x46767f0

将向对象发送-description消息。这将打印出您的NSString的内容,但我建议在将随机消息发送到随机地址之前使用Brian的答案来检查地址的内容。

答案 4 :(得分:0)

<强> addr2line

此Binutils实用程序可以处理任何符号地址,包括变量和函数名称。

默认情况下它是非交互式的,在某些情况下,在进行验尸时非常有用。

main.c中:

#include <stdio.h>

int myvar;

int main(void) {
    printf("myvar = %d\n", myvar);
}

编译和反汇编:

gcc -O 0 -g gdb3 -o main -pedantic-errors -std=c89 -Wextra main.c
readelf -s tmp.out  | grep -E ' (main|myvar)'

给出:

55: 0000000000201014     4 OBJECT  GLOBAL DEFAULT   24 myvar
65: 000000000000064a    32 FUNC    GLOBAL DEFAULT   14 main

现在我们可以尝试:

addr2line -e main 201014 64a

给出:

/full/path/to/main.c:3
/full/path/to/main.c:5