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

我想通过串行ttyS0从我的64位suse机器debugging一个MIPS linux驱动程序。 使用的gdb通过debugging应用程序而不是通过串口使用kgdb而在局域网上工作。 我用这个页面和其他几个开始debugging,但没有最终结果。

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

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 

输出(REMOTE_TARGET):

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

没有更多的发生!

我也testing了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是否正确运行?
有没有什么我错过了?
有没有一种方法来testing远程设备上运行的kgdb?

我有很多问题通过串行链接运行gdb与kgdb。 我的主机是英特尔x86 Linux机器,目标是ARM 32位树莓派2.目标连接到USB到TTL串行电缆 。 以下是关键问题及其解决方案。

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或与交叉编译工具集(即arm-linux-gnueabihf-gdb 。 用(gdb) set architecture命令列出可用的体系(gdb) set architecture 。 在我的情况下, auto架构正确地检测到手臂目标。

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

远程回复意外地'vMustReplyEmpty':vMustReplyEmpty

格式错误的响应偏移查询,qOffsets

GDB尝试连接,但目标不在调试模式。 在连接GDB之前,必须触发debug sysrq。 键盘快捷方式不适合我。 以root用户echo g > /proc/sysrq-trigger运行命令echo g > /proc/sysrq-trigger通过SSH。

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

一旦这些问题得到解决,内核调试按预期工作。

我知道这是2年前,但我只是想说,我有我的董事会,不幸的是没有一个局域网接口,通过TCP连接使用gdbserver相同的问题。 我不知道你是否可以解决这个问题,但是如果你的主板有一个局域网接口(或者你可以使用USB转以太网适配器来构建一个接口),那么通过调试是可能的!