1

我试图弄清楚这一点,因为我正在尝试用一个自制的脚本做同样的事情(希望如此):

示例 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

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

4

2 回答 2

1

当您使用该-g标志进行构建时,GCC(和大多数其他编译器)会在您的二进制文件 ( ) 中存储额外的“调试信息” a.out

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

您还可以比较a.out使用和不使用构建时的大小-g。调试二进制文件大 5 到 10 倍的情况并不少见。

于 2011-09-22T02:46:58.110 回答
1

此信息在编译时已知。Gcc 收集并存储它以供不同的工具(在本例中为 gdb)稍后使用。

于 2011-09-21T12:14:38.223 回答