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

Debugging 如何在GDB中获取内存地址的符号名?,debugging,memory,gdb,Debugging,Memory,Gdb,例如,我知道0x46767f0属于NSString*,是否有任何方法可以找出NSString是什么,以帮助我找到我要查找的一些bug?我相信您正在寻找: info symbol <addresss> 您可以阅读更多有关它的信息。如果它是一个堆栈变量,我就不知道该怎么做。否则,请尝试p/a,它将打印符号名称(或偏移到最近的符号名称)。po 0x46767f0 将向对象发送-description消息。这将打印出NSString的内容,但我建议在向随机地址发送随机消息之前,使用Bria

例如,我知道0x46767f0属于NSString*,是否有任何方法可以找出NSString是什么,以帮助我找到我要查找的一些bug?

我相信您正在寻找:

info symbol <addresss>

您可以阅读更多有关它的信息。

如果它是一个堆栈变量,我就不知道该怎么做。否则,请尝试
p/a
,它将打印符号名称(或偏移到最近的符号名称)。

po 0x46767f0

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

gdb>list*0xAABBCCDD


这将告诉您文件名和行号。

addr2line

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

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

main.c

#include <stdio.h>

int myvar;

int main(void) {
    printf("myvar = %d\n", 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
例如,Boost stack trace library使用它来显示堆栈跟踪线:

addr2line -e main 201014 64a
/full/path/to/main.c:3
/full/path/to/main.c:5