我正在通过GDB + KGDB +两个虚拟机+串口调试Linux内核。
如果我们使用GDB来调试一个普通的程序,我们只需按Ctrl+C即可中断程序的执行。
但是,当我将 GDB 连接到远程 KGDB 存根时,无论如何我都无法破坏远程计算机,除非我在 REMOTE 机器上使用以下命令:
echo g > /proc/sysrq-trigger
如何从LOCAL机器上破坏REMOTE调试的Linux内核?
可以让现代 gdb 中断远程内核。我不知道这个选项在 2014 年最初提出这个问题时是否可用。
首先,您需要有合适的内核配置。我通常设置:
CONFIG_MAGIC_SYSRQ=y
CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1
CONFIG_MAGIC_SYSRQ_SERIAL=y
CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE="g"
设置
CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1
启用所有sysrq代码;设置 CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE="g"
意味着为了中断调试器,我们需要发送 <break>g
。
配置到位后,我们就可以像这样设置 gdb
remote interrupt-sequence
序列设置:
set remote interrupt-sequence BREAK-g
现在,当您在 gdb 中输入
^C
时,gdb 将发送 BREAK
信号,然后发送 g
到远程系统,这将中断调试器。看起来像:
^C[New Thread 867]
Thread 1 received signal SIGTRAP, Trace/breakpoint trap.
kgdb_breakpoint () at kernel/debug/debug_core.c:1221
1221 arch_kgdb_breakpoint();
(gdb)
您应该在本地计算机中使用 minicom 来实现两台计算机之间的串行连接:按 Ctrl-A,然后按“F”(这是用于向远程计算机发送中断),然后发送“G”:与您上面提到的 echo 命令相同。