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

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

有时我需要知道不在范围内的结构的大小(甚至不在堆栈上,即 frame 相关命令无济于事).例如。它发生在调试客户端+服务器通信时,当重新启动应用程序时只是为了发现大小不舒服且耗时而破坏结构上下文中的某处。

如何在不考虑当前上下文的情况下找到 header 中定义的 struct 的大小?

在 C/C++ 中,你有 sizeof 函数,它会给出任何类型(包括 struct)或变量的大小。

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

对于 C,gdb 的 "expression language" 只是普通的 C 表达式,带有一些方便的调试扩展。这对 C++ 来说不太正确,主要是因为 C++ 更难解析,所以表达式语言往往是 C++ 的子集加上一些 gdb 扩展。

所以,简短的回答是您可以输入:

(gdb) print sizeof(mystruct)

但是,有一些注意事项。

首先,gdb 的当前语言很重要。您可以使用 show language 找到它。对于 struct 类型,在 C++ 中有一个自动类型定义,但在 C 中没有。所以如果你正在使用 auto 语言(你通常应该这样做),并且在 C 框架中停止,你将需要使用关键字:

(gdb) print sizeof(struct mystruct)

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

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

$ readelf -wi myexecutableorlibrary | grep mystruct

(虽然在现实生活中我通常使用 less 然后仔细检查 DWARF DIE。您需要了解一点 DWARF 才能理解这一点。)

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

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

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