sysrq-g 不会破坏内核

Nav*_*wat 5 kernel-module kgdb

我正在尝试设置 linux 内核模块调试,使用两台机器 - 目标和主机。在目标机器上,我已经编译并安装了一个带有CONFIG_MAGIC_SYSRQ=y标志和其他标志的 3.5.0 内核,用于串行控制台调试。

当我想破坏内核以附加远程 gdb 时,我使用

$ echo g > /proc/sysrq-trigger
Run Code Online (Sandbox Code Playgroud)

但是上面的命令并没有破坏内核。

$ cat /proc/sys/kernel/sysrq" 
Run Code Online (Sandbox Code Playgroud)

上面的命令返回 1,因此启用了魔法 sysrq 键。甚至“echo b > /proc/sysrq-trigger”也在工作并重新启动机器。有人可以指出我可能遗漏了什么吗?

谢谢

小智 5

您首先必须按如下方式配置目标内核

CONFIG_FRAME_POINTER=y
CONFIG_DEBUG_KERNEL=y
CONFIG_KGDB=y
CONFIG_DEBUG_INFO=y
CONFIG_KGDB_SERIAL_CONSOLE=y (here I am using serial port for kgdb) 
CONFIG_MAGIC_SYSRQ= y (for sysrq functions).
Run Code Online (Sandbox Code Playgroud)

现在使用 imx6 配置文件编译内核。使用此编译的内核启动目标。您必须告诉目标您要将哪个串行端口用于 kgdb 用途。在我的情况下,我也为 kgdb 使用相同的控制台端口。您可以通过内核参数或通过 sysfs 条目。对于 imx6 sabrelite 板,我使用 ttymxc1 作为控制台。这将根据您的目标而改变

  1. 作为内核参数 将以下参数添加到 bootargs

    kgdboc=/dev/ttymxc1,115200 到你的论点。

  2. 如果您使用 sysfs 条目,请这样做

echo /dev/ttymxc1,115200 > /sys/module/kgdboc/parameters/kgdboc
Run Code Online (Sandbox Code Playgroud)

由于控制台和调试使用相同的串行端口,因此我们使用代理代理。通过代理代理我们可以获得目标控制台并进行调试。编译agentproxy的源代码可以在以下链接“https://kernel.googlesource.com/pub/scm/utils/kernel/kgdb/agent-proxy/+/agent-proxy-1.96”中找到,为主机编译后,运行如下

sudo ./agent-proxy 5550^5551 0 /dev/ttyS0,115200
Run Code Online (Sandbox Code Playgroud)

现在您可以使用此代理代理支持通过 telnet 查看目标终端

sudo  telnet localhost 5550
Run Code Online (Sandbox Code Playgroud)

(最好使用这个telnet,而不是只有这个代理代理支持的minicom。)当你想开始调试时,目标系统必须从正常模式进入调试模式。我们可以在目标中以这种方式做到这一点

echo g > /proc/sysrq-trigger
Run Code Online (Sandbox Code Playgroud)

现在它将进入调试器模式。现在从主机端在arm编译内核的vmlinux上运行gdb。进入相应的内核源码目录,然后这样做

arm-fsl-linux-gnueabi-gdb ./vmlinux
Run Code Online (Sandbox Code Playgroud)

现在它将显示 gdb 终端。从那里您必须连接到 kgdb 的目标,

$target remote /dev/ttyS0
Run Code Online (Sandbox Code Playgroud)

就我而言,我的主机串行端口是/dev/ttyS0。现在它将连接到目标。之后就可以使用gdb命令来调试内核了。

你试试这个方法。