将GDB通过串口连接到KGDB构建内核的问题

时间:2013-01-29 13:48:09

标签: c linux linux-kernel kernel kgdb


我想通过串口ttyS0从我的64位suse机器调试MIPS linux驱动程序。使用的gdb通过LAN调试应用程序而不是kgdb over serial。我使用了这个page以及其他一些来开始调试但没有最终结果。

我的内核使用以下设置编译:

CONFIG_MAGIC_SYSRQ=y
CONFIG_HAVE_ARCH_KGDB=y
CONFIG_KGDB=y
CONFIG_KGDB_SERIAL_CONSOLE=y
# CONFIG_KGDB_TESTS is not set
CONFIG_CMDLINE="kgdboc=ttyS0,115200"

如果我运行gdb:

gdb vmlinux
(gdb) set remotebaud 115200
(gdb) set debug remote 1
(gdb) target remote /dev/ttyS0

我可以观察到以下输出:

OUTPUT(GDB_TERMINAL):

(gdb) target remote /dev/ttyS0
Remote debugging using /dev/ttyS0
Sending packet: $qSupported:qRelocInsn+#9a...Ack
Timeout in mid-packet, retrying
Timed out.
Timed out.
Ignoring packet error, continuing...
Packet qSupported (supported-packets) is supported
warning: unrecognized item "qSupported:qRelocIns" in "qSupported" response
Sending packet: $Hg0#df...Nak
Sending packet: $Hg0#df...Ack
Packet received: Hg0
Sending packet: $?#3f...Packet instead of Ack, ignoring it
Ack
Timed out.
Timed out.
Timed out.
Ignoring packet error, continuing...
Sending packet: $Hc-1#09...Nak
Sending packet: $Hc-1#09...Ack
Reply contains invalid hex digit 36

OUTPUT(REMOTE_TARGET):

+$?#3f09n+#9a$Hg0#df+09

没有更多的事情发生!!!

我也测试了sysrq但是提到的sysrq-option'g'似乎不合适!

echo b > /proc/sysrq-trigger 
#successfully reboot

echo g > /proc/sysrq-trigger 
#prints only the help message (SysRq : HELP : loglevel(0-9) reBoot Crash termin .....)

sysrq是否正常运行?
有没有我错过的东西?
有没有办法测试我的远程设备上运行的kgdb?

2 个答案:

答案 0 :(得分:1)

我通过串行链接运行带有kgdb的gdb有很多问题。我的主机是Intel x86 Linux机器,目标是ARM 32位Raspberry Pi 2.目标与USB to TTL Serial Cable连接。以下是关键问题及其解决方案。

1)不要与gdbscreen同时使用minicom

在tty上连接了minicom,GDB挂起然后崩溃:

(gdb) target remote /dev/ttyUSB0
Ignoring packet error, continuing...
Ignoring packet error, continuing...
Ignoring packet error, continuing...
Ignoring packet error, continuing...
/build/gdb-cXfXJ3/gdb-7.11.1/gdb/thread.c:89: internal-error: inferior_thread: Assertion `tp' failed.
A problem internal to GDB has been detected, further debugging may prove unreliable.```

screen连接时,GDB无法连接:

(gdb) tar rem /dev/ttyUSB0
/dev/ttyUSB0: Device or resource busy.

2)数据包损坏和超时

  

无效的数据包,错误的校验和,看到新的数据包从旧的中间开始,超时

使用支持目标架构的GDB。 x86上的默认GDB(至少在Ubuntu上)不支持arm目标。请改为使用gdb-multiarch或与交叉编译工具集相对应的GDB,即arm-linux-gnueabihf-gdb。使用(gdb) set architecture命令列出可用的architecutres。在我的情况下,auto架构正确地检测到了手臂目标。

3)必须在连接之前在目标上触发KGDB

  

远程意外回复'vMustReplyEmpty':vMustReplyEmpty

     

对偏移量查询的错误响应,qOffsets

GDB尝试连接,但目标未处于调试模式。必须在连接GDB之前触发debug sysrq。键盘快捷键对我不起作用。以root身份通过SSH运行命令echo g > /proc/sysrq-trigger

4)配置波特率

  

警告:无效的波特率115200.最大值为38400。   / dev / ttyUSB0:参数无效。

配置的波特率必须匹配kgdboc内核参数和GDB。就我而言,不支持波特率115200。建议将波特率设置为38400是必要的。使用内核cmdline重新启动目标:kgdboc=ttyAMA0,38400然后:

(gdb) set remotebaud 38400
(gdb) target remote /dev/ttyUSB0
Remote debugging using /dev/ttyUSB0
0x800b4730 in kgdb_breakpoint ()

解决了这些问题后,内核调试按预期工作。

答案 1 :(得分:0)

我知道这是2年前,但我只想说我的电路板遇到了同样的问题,遗憾的是没有LAN接口通过TCP连接使用gdbserver。我不知道你是否能解决这个问题,但如果你的主板确实有一个LAN接口(或者你可以使用USB到以太网适配器构建一个接口),那么通过它可以进行调试!