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

gdb:它如何知道变量类型和大小?,gdb,binutils,Gdb,Binutils,我试图弄明白这一点,因为我正试图用一个国产脚本做同样的事情(希望如此): 示例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

我试图弄明白这一点,因为我正试图用一个国产脚本做同样的事情(希望如此):

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

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

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

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

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


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

您的问题不清楚。如果您在程序中想要访问
a_ptr
,那么您只需要像在gdb中一样访问这个&u b.a_ptr。如果您想自己编写一个调试器(或等效的代码访问),那么我建议您查看gdb源代码并找出它是如何实现的。