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