【问题标题】:Needs debugging symbols for __alignof__需要为 __alignof__ 调试符号
【发布时间】:2019-05-13 23:17:39
【问题描述】:

我正在调试 glibc 库。我用 -g3 -O 标志构建了它。我可以打印大多数宏,但不能打印这个。我在调试malloc(),有很多宏使用__alignof__。但是我在 glibc 源代码中的任何地方都找不到它的定义。这是一个例子:

(gdb) p MALLOC_ALIGN_MASK
No symbol "__alignof__" in current context.

我也遇到了与 __builtin_offsetof 相同的问题。但这是一个内置的宏。所以这两种情况有点不同。解决这个问题会加快我的调试速度。

【问题讨论】:

标签: c gdb glibc


【解决方案1】:

GDB 只有一个非常近似的 C 和 C++ 实现。它不使用与 GCC 相同的 C 和 C++ 解析器,因此缺少一些东西,包括这个 GCC 扩展。 GDB 可以识别_Alignof,但它与__alignof__ 并不完全相同。但它会在这种情况下工作,因此您可以更改 glibc 源以使用它。

LLDB 使用 Clang 解析器,因此不会遇到这个特定问题,但在这里不会帮助您,因为显然,调试器无法识别由 -g3 选项生成的 DWARF 数据,因此宏信息丢失可执行文件。

【讨论】:

    【解决方案2】:

    您不会得到任何调试信息。因为__alignof__sizeof 一样,只在编译时知道。见alignof 来自<stdalign.h>

    即使重新编译 GCC 本身,您也不会得到它(没有可用的调试信息没有)。 __alignof__ 在编译时处理(所以在编译期间__alignof__ (double) 被 8 替换,对于 x86-64 ABI)。

    你可以自己猜出MALLOC_ALIGN_MASK的扩展值。

    您可以定义const int my_malloc_align_mask = MALLOC_ALIGN_MASK; 并在调试器中使用p my_malloc_align_mask

    我正在调试 glibc 库。

    这很奇怪。您应该信任glibc 库的行为与记录一致(是的,请注意未定义的行为)。

    【讨论】:

    • 一些背景信息:最近(2018 年 9 月)发布了 GDB 8.2 版及更高版本,了解_Alignof,相当于__alignof__;那么,macro define __alignof__ _Alignof 在 GDB 中就足够了。 GDB 已经支持sizeof__builtin_offsetof(type, member) 可以在 GDB 中定义为 macro define __builtin_offsetof(t, f) ((unsigned long)(&((t *)0)->f)))
    • 谢谢巴西尔。实际上,我想研究 malloc() 的内部结构,例如如何分配内存块。使用调试器单步执行代码是一种很好的方法。
    • 这应该进入你的问题:你不是在调试libc,而是试图理解它
    • 感谢@NominalAnimal 的建议,但__builtin_offsetof 的末尾多了一个括号。应该是macro define __builtin_offsetof(t, f) ((unsigned long)(&((t *)0)->f))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 2020-12-06
    • 1970-01-01
    • 2012-09-18
    相关资源
    最近更新 更多