例如,我知道0x46767f0属于一个NSString*,是否有办法可以找出它是哪个NSString以帮助我找到一些我需要的bug?
我相信你正在寻找:
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
您可以在此处了解更多相关信息。
gdb> list *0xAABBCCDD
这将告诉您文件名和行号。
如果它是堆栈变量,我不知道有什么方法可以做到这一点。否则,请尝试p/a <pointer symbol or address>
,它将打印符号名称(或最近符号名称的偏移量)。
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
po 0x46767f0
这将向对象发送一个-description
消息。这会打印出NSString的内容,但我建议在向随机地址发送随机消息之前,请使用Brian的答案检查您地址的内容。