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

54
例如,我知道0x46767f0属于一个NSString*,是否有办法可以找出它是哪个NSString以帮助我找到一些我需要的bug?

5个回答

74

我相信你正在寻找:

info symbol <addresss>

打印存储在地址 addr 处的符号名称。如果没有恰好存储在 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

您可以在此处了解更多相关信息。


1
备注:这里的“nearest”意思是“最近之前”(这通常是您想要的)。 - user202729

16

gdb> list *0xAABBCCDD

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


6

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


3

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

Boost堆栈跟踪库使用示例,例如用于显示堆栈跟踪行:在C或C++中打印调用堆栈

3

po 0x46767f0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接