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

GDB:linux内置模块中的断点失败,linux,linux-kernel,operating-system,gdb,Linux,Linux Kernel,Operating System,Gdb,我正在使用两个通过串口连接的虚拟机调试linux内核 目标机器通过在/boot/grub/grub.cfg中的正确条目中插入kgdbwait()和kgdboc=ttys0115200等待远程gdb的连接 在主机中 sudo gdb ./vmlinux 符号被读取,我应该能够在函数名上设置断点 (gdb) break oom_kill_process Breakpoint 1 at 0xc1172ef0: file mm/oom_kill.c, line 843. 很好 但是,如果我在找到的h

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

目标机器通过在
/boot/grub/grub.cfg
中的正确条目中插入
kgdbwait()
kgdboc=ttys0115200
等待远程gdb的连接

在主机中

sudo gdb ./vmlinux
符号被读取,我应该能够在函数名上设置断点

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

但是,如果我在找到的
htb_dequeue_树
上设置断点,则会出现以下错误:

(gdb) break htb_dequeue_tree
当前上下文中没有符号“htb_出列树”


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

在您的特定情况下,函数是静态的,只有一个用户:htp_dequeue。如果反汇编它,您可能会看到htp_dequeue_树中的代码。如果没有,则会发生其他破坏(破坏其他功能是否有效?

问题在于,这是一个动态插入的内置模块,因此在制作时,它不包含在包含符号的
vmlinux
文件中

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

快跑

make menuconfig
找到模块,并将其从
更改为


重新制作内核,安装模块并安装,这将产生一个新的
vmlinux
,其中将包含所需模块的符号,因此您可以在任何行\函数名处进行断点设置。

此函数可能是内联的。尝试在一个具体地址(b*0x12345678)上设置一个中断@AlexHoppus我尝试了
中断net/sched/sch_htb.c:htb_dequeue_tree
,但没有成功。当我为
mm/oom\u kill.c:oom\u kill\u进程执行此操作时
成功了,因此由于某种原因
schu htb.c
无法识别?无论如何,谢谢您的评论,但是我如何找到函数的地址呢?请使用objdump vmlinux。我不明白你说的话是如何反驳我关于内联函数的假设的。@AlexHoppus无意反驳你的建议,我想补充一点,就是没有找到
schu htb.c
。如果可以重建内核使用属性(优化(“O0”))和(noinline))的话,我没有得到名为net/sched/sch_htb.c的源文件,我得到的只是没有名为net/sched/sch_htb.c的源文件,结果是另一回事。谢谢你的帮助。