C 无法在kgdb安装程序中的某些函数上设置断点

C 无法在kgdb安装程序中的某些函数上设置断点,c,linux,debugging,linux-kernel,kgdb,C,Linux,Debugging,Linux Kernel,Kgdb,我使用两台虚拟机设置了kgdb,两台都有CentOs 6.4,实际上kgdb主机是目标的克隆。我已成功连接到远程目标并开始调试。我想调试RAID驱动程序,特别是raid456.ko。我的问题是,在gdb下使用addsymbolfile命令加载这个raid456.ko的符号后,我能够在少数函数上设置断点,但我不能在少数函数上设置断点。例如,我可以在ops_run_BioPill函数上设置断点,但不能在ops_run_biodrain函数上设置断点。这两个函数都是静态函数,都是raid5.c文件的一

我使用两台虚拟机设置了kgdb,两台都有CentOs 6.4,实际上kgdb主机是目标的克隆。我已成功连接到远程目标并开始调试。我想调试RAID驱动程序,特别是raid456.ko。我的问题是,在gdb下使用addsymbolfile命令加载这个raid456.ko的符号后,我能够在少数函数上设置断点,但我不能在少数函数上设置断点。例如,我可以在ops_run_BioPill函数上设置断点,但不能在ops_run_biodrain函数上设置断点。这两个函数都是静态函数,都是raid5.c文件的一部分。如果我尝试在ops_run_biodrain上设置断点,则会显示:

gdb操作运行生物排水管

未定义函数ops\u run\u biodrain。 是否在将来加载共享库时使断点挂起?y或[n]

为什么可以调试的功能很少,为什么有些功能不能调试

[编辑]-----------
我进一步研究了这个问题,发现使用nm实用程序,我们可以找到某些特定对象文件的任何符号部分的名称和虚拟地址。我在raid456.ko上尝试了nm,发现nm命令的输出中有ops_run_biofill函数,但输出中没有ops_run_biodrain函数。这是否意味着ops_run_biodrain不在raid456.ko中?如果是,那么为什么它不是raid456.ko的一部分?ops_run_biodrain未接受任何宏检查。

找到问题的解决方案。由于编译优化,很少有符号未被检测到。禁用raid驱动程序优化后,KGDB可以检测到这些符号并能够在其上设置断点