代码之家  ›  专栏  ›  技术社区  ›  Tony Tannous

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

  •  0
  • Tony Tannous  · 技术社区  · 7 年前

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

    目标机器 通过插入 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.
    

    很好用!

    但是,如果我在 htb_dequeue_tree 找到了 here ,我得到以下错误:

    (gdb) break htb_dequeue_tree
    

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

    2 回复  |  直到 7 年前
        1
  •  0
  •   employee of the month    7 年前

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

    在您的特定情况下,函数是静态的,只有一个用户:htp_dequeue。如果你把它拆开,你可能会看到htp出列树中的代码。如果没有,还有一些其他的中断正在进行(中断其他功能是否有效?)

        2
  •  0
  •   Tony Tannous    7 年前

    问题是 HTB 是动态插入的内置模块,因此在生成时,它不包括在 vmlinux 包含符号的文件。

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

    快跑

    make menuconfig
    

    找到模块,并将其从 <m> <*>

    重新生成内核,安装模块并进行安装,这将导致 vmlinux系统 它将包含所需模块的符号,因此您可以在任何行/函数名处断点。