【问题标题】:Show macros in debug symbols (embedded)在调试符号中显示宏(嵌入式)
【发布时间】:2014-08-14 21:24:10
【问题描述】:

我正在使用嵌入式应用程序,在调试期间,调试器无法解析宏符号(我的理论:因为宏在预处理中丢失)。我最终不得不先在源代码中找到宏,然后使用定义来观察变量。

我的问题是: 有没有办法通过elf文件将宏定义合并到里面? 如果是,我需要哪些步骤(例如,我需要在编译期间设置标志)? 如果没有,为什么不呢?

感谢任何信息。 我的确切设置是 WindRiver 编译器和 Lauterbach 调试器。 但是如果您有其他环境的信息,请分享,也许我可以找到适合我环境的对应物。

【问题讨论】:

  • 这是应该避免使用宏的主要原因(即它们不容易调试)。
  • gcc 编译用-g3 嵌入一个宏,然后用info macrogdb
  • 考虑使用枚举常量和/或常量对象而不是宏。详情请见this article
  • @kkrambo,如果可以的话,我会的。
  • @ouah 谢谢。这就是我正在寻找的信息

标签: c debugging macros embedded


【解决方案1】:

不确定这如何转化为您的编译器和调试器,but it's possible with GCC and GDB

如果你重建并告诉 GCC 生成为 GDB 优化的调试符号,使用-ggdb3,它可以保留宏信息:

$ make KCFLAGS=-ggdb3
...
(gdb) info macro task_is_stopped_or_traced
Defined at include/linux/sched.h:218
  included at include/linux/nmi.h:7
  included at kernel/sched.c:31
#define task_is_stopped_or_traced(task) ((task->state & (__TASK_STOPPED | __TASK_TRACED)) != 0)

(gdb) macro expand task_is_stopped_or_traced(init_task)
expands to: ((init_task->state & (4 | 8)) != 0)

(gdb) p task_is_stopped_or_traced(init_task)
$2 = 0

【讨论】:

    【解决方案2】:

    通常,由于 C 文件的编译方式,宏不会出现在调试符号中。

    首先,文件被预处理,宏被扩展。然后,删除所有预处理指令,并丢弃宏定义。接下来,实际编译为机器码,这是编译器构建调试信息的地方。

    【讨论】:

      猜你喜欢
      • 2022-06-27
      • 2020-09-14
      • 1970-01-01
      • 2012-08-08
      • 2013-06-15
      • 2020-08-24
      • 2010-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多