在调试符号中显示宏(嵌入式)

时间:2014-08-14 21:24:11

标签: c debugging macros embedded

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

$ 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

答案 1 :(得分:0)

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

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