45

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

4

5 回答 5

64

我相信您正在寻找:

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

你可以在这里阅读更多关于它的信息。

于 2009-04-18T00:33:10.357 回答
16

gdb> 列表 *0xAABBCCDD

这会告诉你文件名和行号。

于 2012-11-29T17:01:20.180 回答
6

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

于 2009-04-18T00:34:11.837 回答
3

宝 0x46767f0

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

于 2009-04-18T06:05:17.237 回答
2

addr2line

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

默认情况下它是非交互式的,这在某些情况下很有用,在进行事后分析时。

主程序

#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 堆栈跟踪库使用它来显示堆栈跟踪行:print call stack in C or C++

于 2018-03-30T16:14:17.270 回答