无法在kgdb设置中的某些功能上设置断点

时间:2014-04-22 08:59:06

标签: c linux debugging linux-kernel kgdb

我使用两个虚拟机设置了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不在任何宏检查之下。

1 个答案:

答案 0 :(得分:0)

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