有什么方法可以在 GDB 的 Python API 中(或直接在 GDB 中)获得类型的对齐方式?
Is there any way to obtain type's alignment in GDB's Python API (or directly in GDB)?
对于我正在编写的漂亮打印机,我想知道容器中使用的对齐方式或类型。不幸的是,使用 alignof()
或任何类似的 "standard" 运算符不起作用 (https://sourceware.org/bugzilla/show_bug.cgi?id=17095)。使用直接在源代码中工作的 "typical" 宏技巧也不起作用:
p ((char *)(&((struct { char c; double _h; } *)0)->_h) - (char *)0)
A syntax error in expression, near `{ char c; double _h; } *)0)->_h) - (char *)0)'.
这是否可能,或者唯一的方法是让 GDB 内部支持它?
无法获取此信息,因为目前 gdb 没有。
在 DWARF 版本 5 之前,没有标准的方式来表示调试信息中的对齐。 DWARF 5 添加了 DW_AT_alignment
,但 gdb 仍然简单地忽略了这个属性;通过 Python API 公开它需要读取它并将其存储在 gdb 的内部 struct type
中。我不知道编译器是否会发出此属性。
如果你非常绝望,你可以使用 gdb compile
功能或自己 运行 编译器来做到这一点,并让它以一种可以提取的方式发出对齐。
但是,通常根据相关字体大小计算对齐并不太难,如果您的目标体系结构相对有限,那么使用您自己的对齐计算机可能会更简单。
对于我正在编写的漂亮打印机,我想知道容器中使用的对齐方式或类型。不幸的是,使用 alignof()
或任何类似的 "standard" 运算符不起作用 (https://sourceware.org/bugzilla/show_bug.cgi?id=17095)。使用直接在源代码中工作的 "typical" 宏技巧也不起作用:
p ((char *)(&((struct { char c; double _h; } *)0)->_h) - (char *)0)
A syntax error in expression, near `{ char c; double _h; } *)0)->_h) - (char *)0)'.
这是否可能,或者唯一的方法是让 GDB 内部支持它?
无法获取此信息,因为目前 gdb 没有。
在 DWARF 版本 5 之前,没有标准的方式来表示调试信息中的对齐。 DWARF 5 添加了 DW_AT_alignment
,但 gdb 仍然简单地忽略了这个属性;通过 Python API 公开它需要读取它并将其存储在 gdb 的内部 struct type
中。我不知道编译器是否会发出此属性。
如果你非常绝望,你可以使用 gdb compile
功能或自己 运行 编译器来做到这一点,并让它以一种可以提取的方式发出对齐。
但是,通常根据相关字体大小计算对齐并不太难,如果您的目标体系结构相对有限,那么使用您自己的对齐计算机可能会更简单。