gdb:它如何知道变量的类型和大小?

时间:2011-09-21 08:35:42

标签: gdb binutils

我正试图解决这个问题,因为我正试图用本土脚本做同样的事情(希望如此):

示例C代码:

typedef struct _B
{
    A aa;
    double b;
    char c[LEN];
    int d;
    char *a_ptr[10];
 } B;

 B this_b;

如果我之后使用gcc -ggdb a.out进行编译,gdb确切知道a_ptr的确切内容和位置:

(gdb) p &(this_b.a_ptr)
$1 = (char *(*)[10]) 0x804a084

它是怎么做到的?我可以通过其他工具做同样的事情(知道它的地址和类型)吗?

2 个答案:

答案 0 :(得分:1)

此信息在编译时已知。 Gcc收集它并存储它以供以后使用不同的工具(在这种情况下为gdb)。

答案 1 :(得分:1)

使用-g标志构建时,GCC(以及大多数其他编译器)会在二进制文件(a.out)中存储其他“调试信息”。

您可以使用GDB以外的工具检查该信息。例如,readelf -w a.out(假设您使用的是Linux或其他ELF平台)。

您还可以在使用a.out时使用-g来比较{{1}}的大小。调试二进制文件大5到10倍并不罕见。