gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:12:52 25 4
gpt4 key购买 nike

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

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

最佳答案

对于 C,gdb 的“表达式语言”只是普通的 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 不会为它发出 DWARF。

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

$ readelf -wi myexecutableorlibrary | grep mystruct

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

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

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

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

关于c++ - gdb:不在上下文中的结构的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28982534/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com