我正在使用嵌入式应用程序,并且在调试期间,调试器无法解析宏符号(我的理论:因为宏在预处理中丢失)。我最终必须首先在源代码中找到宏,然后使用定义来观察变量。
我的问题是: 有没有办法将elf文件中的宏定义合并? 如果是,我需要哪些步骤(例如,我需要在编译期间设置标志)? 如果不是,为什么不呢?
任何信息表示赞赏。 我的确切设置是WindRiver编译器和lauterbach调试器。 但如果您有关于其他环境的信息,请分享,也许我可以找到适合我环境的对应物。
答案 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文件的编译方式,宏不会出现在调试符号中。
首先,对文件进行预处理,然后展开宏。然后,删除所有预处理指令,并丢弃宏定义。接下来,实际编译到机器代码,这是编译器构建调试信息的地方。