【问题标题】:sysrq-g wont break kernelsysrq-g 不会破坏内核
【发布时间】:2013-06-26 20:25:56
【问题描述】:

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

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

$ echo g > /proc/sysrq-trigger

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

$ cat /proc/sys/kernel/sysrq" 

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

谢谢

【问题讨论】:

  • 我使用“kgdboc=ttyS0,115200 vmalloc=256MB”作为引导参数。我也尝试过不使用vmalloc,但仍然无法正常工作。我提到了 kernel.org
  • 我会尝试使用 kgdbwait 参数。如果它甚至没有停止,那么你可能在配置时错过了一些东西。
  • 好吧,我的错,当我使用万用表检查时,发现我使用的电缆不是空调制解调器电缆。一旦我切换了电缆,它就起作用了。
  • @NaveenRawat 你是如何验证这一点的?

标签: kernel-module kgdb


【解决方案1】:

你首先配置你的目标内核如下

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).

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

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

kgdboc=/dev/ttymxc1,115200 to your arguments.

2) 如果您使用的是 sysfs 条目,请这样做

echo /dev/ttymxc1,115200 > /sys/module/kgdboc/parameters/kgdboc

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

sudo ./agent-proxy 5550^5551 0 /dev/ttyS0,15200

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

sudo  telnet localhost 5550

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

echo g > /proc/sysrq-trigger

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

arm-fsl-linux-gnueabi-gdb ./vmlinux

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

$target remote /dev/ttyS0

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

你试试这个方法。

【讨论】:

    猜你喜欢
    • 2013-07-04
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 2022-10-07
    • 1970-01-01
    相关资源
    最近更新 更多