GDB:不在上下文中的结构的大小?
gdb: size of a struct that isn't in context?
有时我需要知道不在范围内的结构的大小(甚至在堆栈上也没有,即 frame
相关的命令将无济于事)。例如,它发生在调试客户端+服务器通信时,重新启动应用程序以在结构上下文中的某个地方中断以查找大小是不舒服且耗时的。
如何查找标头中定义的struct
的大小,而不考虑我的当前上下文?
来说,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。
您可以使用 readelf
或 dwgrep
检查该类型是否可用,例如:
$ readelf -wi myexecutableorlibrary | grep mystruct
(尽管在现实生活中,我通常使用less
然后仔细检查矮人DIE。 你需要知道一点矮人才能理解这一点。
有时在 gdb 中,使用"文件名"扩展名来准确指定您指的是哪个实体很方便。 喜欢:
(gdb) print 'myfile.c'::variable
不确定这是否适用于类型,无论如何,通常不需要它们。
在 C/C++ 中,你有 sizeof
函数,它将为您提供任何类型(包括struct
)或变量的大小。
我不确定您是否可以在调试时应用它,但您可以简单地让具有相同标头(类型定义)的测试程序告诉您类型的大小。
- 如何循环打印顶点结构
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 预处理器:插入结构名称中的前一个行号
- #为""定义宏;静态";针对不同的上下文
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 孤立代码块在结构中引发异常
- 有什么方法可以遍历结构吗
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 无法将结构注册为增强几何体3D点
- 与互斥锁相比,旋转锁可以保证上下文切换
- 多成员Constexpr结构初始化
- C++将文本文件中的数据读取到结构数组中
- 如何重构类层次结构以避免菱形问题
- 如何在C++中序列化结构数据
- std::vector的包装器,使数组的结构看起来像结构的数组
- 没有为自己的结构调用列表推回方法
- c++中定义上下文和实例化点之间对非依赖结构的解释差异
- 上下文结构不包含 Eip?C++