gdb:它如何知道变量类型和大小?
我试图弄明白这一点,因为我正试图用一个国产脚本做同样的事情(希望如此): 示例C代码: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
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源代码并找出它是如何实现的。