例如,我知道 0x46767f0 属于一个 NSString*,有什么方法可以找出它是什么 NSString 来帮助我找到我想要的一些错误?
问问题
57912 次
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 回答