例如,我知道0x46767f0属于NSString *,有什么方法可以找出NSString是什么来帮助我找到一些我想要的错误?
答案 0 :(得分:50)
我相信你在寻找:
info symbol <addresss>
打印存储在地址地址中的符号名称。如果没有符号完全存储在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
您可以详细了解here。
答案 1 :(得分:12)
GDB&GT; list * 0xAABBCCDD
告诉你文件名和行号。
答案 2 :(得分:3)
如果它是一个堆栈变量,我无法做到这一点。否则,请尝试p/a <pointer symbol or address>
,它将打印符号名称(或偏移到最近的符号名称)。
答案 3 :(得分:3)
po 0x46767f0
将向对象发送-description
消息。这将打印出您的NSString的内容,但我建议在将随机消息发送到随机地址之前使用Brian的答案来检查地址的内容。
答案 4 :(得分:0)
<强> 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