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

发布于 2024-12-05 23:49:45 字数 445 浏览 1 评论 0原文

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

示例 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

苏璃陌 2024-12-12 23:49:45

当您使用 -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 another ELF 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.

送你一个梦 2024-12-12 23:49:45

此信息在编译时已知。 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).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文