GDB:linux内置模块中的断点失败

时间:2018-05-31 07:03:11

标签: linux linux-kernel operating-system gdb

我正在使用通过串口连接的两台虚拟机来调试linux内核。

目标计算机等待来自远程gdb的连接,方法是将kgdbwait()kgdboc=ttyS0,115200插入/boot/grub/grub.cfg中的正确条目。

主机

sudo gdb ./vmlinux

读取符号,我应该能够在函数名称上添加断点。

(gdb) break oom_kill_process
Breakpoint 1 at 0xc1172ef0: file mm/oom_kill.c, line 843.

工作正常!

但是,如果我在找到herehtb_dequeue_tree处设置断点,则会收到以下错误:

(gdb) break htb_dequeue_tree
  

当前上下文中没有符号“htb_dequeue_tree”。

2 个答案:

答案 0 :(得分:0)

最典型的原因是函数内联 - 然后没有符号开头。通常你可以在文件+行对上放置一个中断(例如foo.c:42)。

在您的特定情况下,该函数是静态的,只有一个用户:htp_dequeue。如果您反汇编它,您可能会看到来自htp_dequeue_tree的代码悄悄进入。如果没有,还会发生其他一些破坏(打破其他功能有效吗?)

答案 1 :(得分:0)

问题是HTB是一个动态插入的内置模块,因此在制作时,它不包含在包含符号的OfficeArchitect.Validation.CommandHandler.csproj文件中。

要解决此问题,必须将其更改为内部部件而非模块,这可以在vmlinux

中完成

跑步

menuconfig

找到该模块,并将其从make menuconfig 更改为<m>

重新制作你的内核,安装模块并安装,这应该会产生一个新的<*>,它将包含所需模块的符号,这样你就可以在任何一行\ function name上断点。