我使用两个虚拟机设置了kgdb,两个都有CentOs 6.4(实际上kgdb主机是目标克隆)。我成功地能够连接到远程目标并开始调试。我想调试RAID驱动程序,特别是raid456.ko。我的问题是我能够在gdb下使用add-symbol-file命令加载此raid456.ko的符号后在几个函数上设置断点,但我无法在少数函数上设置断点。例如,我可以在ops_run_biofill函数上设置断点,但不在ops_run_biodrain函数上设置断点。两者都是静态函数和raid5.c文件的一部分。如果我尝试在ops_run_biodrain上设置断点,则显示:
(gdb)b ops_run_biodrain
功能“ops_run_biodrain”未定义。 在未来的共享库加载中使断点挂起? (y或[n])
为什么很少有功能可以调试,为什么其他功能不可以?
[编辑] --------------------- 我进一步研究了这个问题,我发现使用nm实用程序,我们可以找到某个特定目标文件的任何符号部分的名称和虚拟地址。我在raid456.ko上尝试了nm,发现ops_run_biofill函数在nm命令的输出中,但ops_run_biodrain不在输出中。这是否意味着ops_run_biodrain不在raid456.ko中?如果是,那么为什么它不是raid456.ko的一部分? ops_run_biodrain不在任何宏检查之下。
答案 0 :(得分:0)
找到问题的解决方案。由于编译优化,很少检测到符号。禁用raid驱动程序的优化后,KGDB可以检测到这些符号并能够在它们上设置断点。