我正试图解决这个问题,因为我正试图用本土脚本做同样的事情(希望如此):
示例C代码:
typedef struct _B
{
A aa;
double b;
char c[LEN];
int d;
char *a_ptr[10];
} B;
B this_b;
如果我之后使用gcc -g
和gdb a.out
进行编译,gdb
确切知道a_ptr
的确切内容和位置:
(gdb) p &(this_b.a_ptr)
$1 = (char *(*)[10]) 0x804a084
它是怎么做到的?我可以通过其他工具做同样的事情(知道它的地址和类型)吗?
答案 0 :(得分:1)
此信息在编译时已知。 Gcc收集它并存储它以供以后使用不同的工具(在这种情况下为gdb)。
答案 1 :(得分:1)
使用-g
标志构建时,GCC(以及大多数其他编译器)会在二进制文件(a.out
)中存储其他“调试信息”。
您可以使用GDB以外的工具检查该信息。例如,readelf -w a.out
(假设您使用的是Linux或其他ELF
平台)。
您还可以在使用a.out
时使用-g
来比较{{1}}的大小。调试二进制文件大5到10倍并不罕见。