2013-06-26 38 views
3

我想设置linux内核模块调试,使用两台机器 - 目标和主机。在目标机器上,我编译并安装了一个带有CONFIG_MAGIC_SYSRQ=y标志和其他标志的3.5.0内核,用于通过串行控制台调试。sysrq-g不会中断内核

当我想打破内核将远程GDB,我用

$ echo g > /proc/sysrq-trigger 

但上面的命令不会破坏内核。

$ cat /proc/sys/kernel/sysrq" 

上面的命令返回1,因此魔术sysrq键被启用。甚至“echo b>/proc/sysrq-trigger”正在工作并重新启动机器。任何人都可以指出我可能错过了什么吗?

感谢

+0

你的内核参数是否正确?请参阅https://www.kernel.org/pub/linux/kernel/people/jwessel/kdb/EnableKGDB.html。 – dbrank0

+0

我已经使用“kgdboc = ttyS0,115200 vmalloc = 256MB”作为启动参数。我也试过没有vmalloc,但仍然无法正常工作。我已经提到kernel.org –

+0

我会试着用kgdbwait参数。如果它甚至没有停止,那么在配置时你可能会漏掉一些东西。 – dbrank0

回答

3

你首先配置目标内核如下

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的entry.For imx6 sabrelite板,我使用ttymxc1为console.This将根据你的目标

1)为内核参数 添加更改以下参数bootargs

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

2)如果您正在使用sysfs条目,请这样做:

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

由于同一个串口用于控制台和调试,我们使用代理代理。通过代理代理,我们可以获得目标控制台以及调试。 来源编制座席代理模块可通过以下链接 “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 

现在它会进入调试模式。 现在从主机端运行gdb on arm编译内核的vmlinux。 转到相应的内核源代码目录,做这样的

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

,我们将会看到GDB终端。从那里,你必须连接到目标进行的kgdb,

$target remote /dev/ttyS0 

在我的情况,我的主机串行端口是/ dev/ttyS0来。 现在它会连接到目标。在此之后,您可以使用gdb命令来调试内核。

您试试这种方式。