GDB:不在上下文中的结构的大小?

gdb: size of a struct that isn't in context?

本文关键字:结构 上下文 GDB      更新时间:2023-10-16

有时我需要知道不在范围内的结构的大小(甚至在堆栈上也没有,即 frame 相关的命令将无济于事)。例如,它发生在调试客户端+服务器通信时,重新启动应用程序以在结构上下文中的某个地方中断以查找大小是不舒服且耗时的。

如何查找标头中定义的struct的大小,而不考虑我的当前上下文?

对于 C

来说,gdb 的"表达式语言"只是普通的 C 表达式,有一些方便的调试扩展。 对于C++来说,情况并非如此,主要是因为C++更难解析,因此表达式语言往往是C++的子集加上一些gdb扩展。

因此,简短的回答是您只需键入:

(gdb) print sizeof(mystruct)

但是,有一些警告。

首先,gdb 当前的语言很重要。 你可以找到这个 show language . 在 struct 类型的情况下,C++ 中有一个自动 typedef,但在 C 中没有。 因此,如果您使用的是auto语言(通常应该使用),并且停止在 C 框架中,则需要使用关键字:

(gdb) print sizeof(struct mystruct)

现在,这仍然可能不起作用。 此时的常见原因是该结构未在程序中使用,因此不会显示在调试信息中。 即使您认为调试信息应该可用,也可以对其进行优化,因为它取决于编译器。 例如,我认为如果struct仅用于sizeof表达式(并且从未定义过该类型的变量),那么我认为(很难确定)GCC 不会为它发出 DWARF。

您可以使用 readelfdwgrep 检查该类型是否可用,例如:

$ readelf -wi myexecutableorlibrary | grep mystruct

(尽管在现实生活中,我通常使用less然后仔细检查矮人DIE。 你需要知道一点矮人才能理解这一点。

有时在 gdb 中,使用"文件名"扩展名来准确指定您指的是哪个实体很方便。 喜欢:

(gdb) print 'myfile.c'::variable

不确定这是否适用于类型,无论如何,通常不需要它们。

在 C/C++ 中,你有 sizeof 函数,它将为您提供任何类型(包括struct)或变量的大小。

我不确定您是否可以在调试时应用它,但您可以简单地让具有相同标头(类型定义)的测试程序告诉您类型的大小。