gdb:它如何知道变量类型和大小?
我试图弄清楚这一点,因为我试图用自制脚本做同样的事情(希望):
示例 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
它是如何做到这一点的?我可以通过其他实用程序做同样的事情(知道它的地址和类型)吗?
I'm trying to figure this out as I'm trying to do the same thing (hopefully) with a home grown script:
Example C code:
typedef struct _B
{
A aa;
double b;
char c[LEN];
int d;
char *a_ptr[10];
} B;
B this_b;
If I compile this with gcc -g
and gdb a.out
afterwards, gdb
knows exactly what and where a_ptr
is:
(gdb) p &(this_b.a_ptr)
$1 = (char *(*)[10]) 0x804a084
how does it do that? And can I do the same thing (knowing it's address and type) through other utilities?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
当您使用
-g
标志进行构建时,GCC(以及大多数其他编译器)会在二进制文件 (a.out
) 中存储额外的“调试信息”。您可以使用 GDB 以外的工具检查该信息。例如,readelf -w a.out(假设您使用的是 Linux 或其他 ELF 平台)。
您还可以比较使用和不使用
-g
构建时a.out
的大小。调试二进制文件大 5 到 10 倍的情况并不罕见。When you build with the
-g
flag, GCC (and most other compilers) stores additional "debugging info" in your binary (a.out
).You can examine that info with tools other than GDB. For example,
readelf -w a.out
(assuming you are on Linux or anotherELF
platform).You can also compare the size of
a.out
when built with and without-g
. It is not uncommon for the debug binary to be 5 to 10 times larger.此信息在编译时已知。 Gcc 收集它并存储它以供稍后由不同工具(在本例中为 gdb)使用。
This info is known on compile time. Gcc gathers it and stores it to be used later by different tools (gdb in this case).