【问题标题】:Can C macros be expanded in gdb when the program was compiled using clang?使用clang编译程序时可以在gdb中扩展C宏吗?
【发布时间】:2014-03-07 02:03:45
【问题描述】:

我有一个宏可以获取整数的第 J 位:

#define TWO_TO_THE(POWER) (1 << POWER)

#define JTH_BIT(BITS, J)  ((TWO_TO_THE((J-1)) & BITS) != 0)

但是,我不能通过发出命令 print JTH_BIT(i,j) 从 gdb 使用它,C 中的宏甚至可以在调试时使用吗?

【问题讨论】:

  • 这应该重新打开,因为这是关于 clang 的问题,假设重复是关于 gcc

标签: c gdb clang c-preprocessor


【解决方案1】:

宏由预处理器处理。编译器甚至不知道它们。

但是,如果幸运的话,GCC 的选项 -g3 会完成这项工作并生成代码,允许 gdb 扩展宏。

来自gdb documentation(我强调):

-glevel

[...] 第 3 级包括额外信息,例如程序中存在的所有宏定义。 一些调试器在您使用 -g3 时支持宏扩展。

【讨论】:

  • 但是这个问题是关于调试器的,而不是编译器。调试器可以访问二进制文件和源代码(通常),所以一切皆有可能。
  • 我将 makefile 更改为使用 -g3 进行编译,但是当我尝试打印宏的结果时,我得到“GDB 没有该代码的预处理器宏信息”,是否需要加载gdb 中的头文件?
  • @TobiLehman:info macro JTH_BIT 告诉你什么?并且:你做了make clean吗?
  • @alk 我做了一个make clean,然后是一个make,以及编译时使用的-g3 arg。然后在调试器中宏在范围内的行中,info macro JTH_BIT 返回GDB has no preprocessor macro information for that code.
  • @TobiLehman:您使用的是哪个 gcc,在哪个平台上?如果您使用的 gcc 版本确实支持宏扩展(如果使用了-g3),您或许应该使用一个简单的(2 行)示例来测试它。
【解决方案2】:

如果您使用正确的选项编译程序,它应该可以工作。在gcc中,编译时需要说“-g3”

参见herehere

【讨论】:

  • 我怀疑这在 op 显然使用 clang 时会有所帮助。
猜你喜欢
  • 2015-08-07
  • 1970-01-01
  • 2014-01-09
  • 2014-02-03
  • 2023-03-19
  • 2021-02-04
  • 2015-05-29
  • 2011-06-02
  • 1970-01-01
相关资源
最近更新 更多