我正在调试glibc库。我已经用-g3 -O标志构建了它。我可以打印大多数宏,但不能打印此宏。我正在调试malloc(),并且有很多使用__alignof__的宏。但是我在glibc源代码的任何地方都找不到它的定义。这是一个示例:
(gdb) p MALLOC_ALIGN_MASK
No symbol "__alignof__" in current context.
而且__builtin_offsetof也遇到了同样的问题。但这是一个内置宏。因此,这两种情况有些不同。解决此问题将加快我的调试速度。
答案 0 :(得分:3)
您将不会获得任何调试信息。由于__alignof__
与sizeof
一样,因此仅在编译时是已知的。请参阅<stdalign.h>
中的alignof
即使重新编译GCC本身,也不会得到它(没有 no 调试信息)。 __alignof__
在编译时被处理(因此,对于x86-64 ABI,__alignof__ (double)
在编译期间被8替换)。
您可以自己猜测MALLOC_ALIGN_MASK
的扩展值。
您可以定义const int my_malloc_align_mask = MALLOC_ALIGN_MASK;
并在调试器中使用p my_malloc_align_mask
。
我正在调试glibc库。
这很奇怪。您应该信任 glibc
库,使其表现为已记录的行为(是的,请注意未定义的行为)。
答案 1 :(得分:2)
GDB仅具有非常近似的C和C ++实现。它不使用与GCC相同的C和C ++解析器,因此缺少某些内容,包括此GCC扩展。 GDB可以识别_Alignof
,但与__alignof__
并不完全相同。但是在这种情况下它将起作用,因此您可以更改glibc源以使用它。
LLDB使用Clang解析器,因此不会遭受此特定问题的困扰,但在这里不能为您提供帮助,因为显然,调试器无法识别由-g3
选项生成的DWARF数据,因此宏信息为可执行文件中缺少。