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

Hi-*_*gel 2 c c++ debugging struct gdb

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

如何struct在忽略当前上下文的情况下找到标题中定义的大小?

Tom*_*mey 6

对于C,gdb的"表达式语言"只是普通的C表达式,有一些方便的扩展用于调试.对于C++来说,这不太正确,主要是因为C++解析起来要困难得多,因此表达式语言往往是C++的一个子集加上一些gdb扩展.

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

(gdb) print sizeof(mystruct)
Run Code Online (Sandbox Code Playgroud)

但是,有一些警告.

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

(gdb) print sizeof(struct mystruct)
Run Code Online (Sandbox Code Playgroud)

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

您可以使用readelf或检查类型是否可用dwgrep,例如:

$ readelf -wi myexecutableorlibrary | grep mystruct
Run Code Online (Sandbox Code Playgroud)

(虽然在现实生活中我经常使用less然后仔细检查DWARF DIE.你需要知道一点DWARF才能理解这一点.)

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

(gdb) print 'myfile.c'::variable
Run Code Online (Sandbox Code Playgroud)

不确定这是否适用于类型,无论如何它通常不是必需的.