我使用两个虚拟机进行kgdb设置,两个虚拟机都具有CentO 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不受任何宏检查。
找到问题的解决方案。由于编译优化,几乎没有检测到任何符号。在禁用RAID驱动程序优化之后,KGDB可以检测到这些符号并能够在其上设置断点。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句