首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过串口将GDB连接到KGDB构建内核的问题

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

Stack Overflow用户
提问于 2013-01-29 13:48:09
回答 2查看 10.2K关注 0票数 8

我想通过串行ttyS0从我的64位suse机器上调试一个MIPS驱动程序。使用的gdb在LAN上调试应用程序时非常出色,但在串行上却不能使用kgdb。我使用了这个页面和其他一些来启动调试,但没有最终结果。

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

代码语言:javascript
复制
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:

代码语言:javascript
复制
gdb vmlinux
(gdb) set remotebaud 115200
(gdb) set debug remote 1
(gdb) target remote /dev/ttyS0

我可以观察到以下输出:

输出(GDB_TERMINAL):

代码语言:javascript
复制
(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):

代码语言:javascript
复制
+$?#3f09n+#9a$Hg0#df+09

什么都不会发生!

我也测试了sysrq,但是提到的sysrq选项'g‘似乎不适合!

代码语言:javascript
复制
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的方法?

EN

回答 2

Stack Overflow用户

发布于 2016-09-14 19:30:59

我有很多问题要用kgdb通过串行链接运行gdb。我的主机是一台英特尔x86 Linux机器,目标是ARM 32位Raspberry 2,目标与USB到TTL串行电缆连接。以下是关键问题及其解决办法。

1)不要将gdbscreenminicom并发使用。

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

代码语言:javascript
复制
(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无法连接:

代码语言:javascript
复制
(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命令列出可用的架构。在我的情况下,auto架构是正确地检测arm目标的。

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

Remote意外回复“vMustReplyEmpty”:vMustReplyEmpty 对偏移量查询、qOffsets的格式错误响应

GDB尝试连接,但目标不在调试模式中。必须在与GDB连接之前触发调试sysrq。键盘快捷键不适合我。通过SSH运行命令echo g > /proc/sysrq-trigger作为根操作。

4)配置波德率

警告:无效波特率115200。最大值是38400。/dev/ttyUSB0 0:无效参数。

配置的波德率必须在kgdboc内核参数和GDB之间匹配。在我的例子中,波德率115200不被支持。按照建议将波德率设置为38400是必要的。使用内核cmdline:kgdboc=ttyAMA0,38400重新启动目标,然后:

代码语言:javascript
复制
(gdb) set remotebaud 38400
(gdb) target remote /dev/ttyUSB0
Remote debugging using /dev/ttyUSB0
0x800b4730 in kgdb_breakpoint ()

一旦解决了这些问题,内核调试就会如愿以偿。

票数 2
EN

Stack Overflow用户

发布于 2015-02-17 13:44:15

我知道这是两年前的事,但我只想说,我的董事会也有同样的问题,不幸的是,我的董事会没有局域网接口,无法通过TCP连接使用gdbserver。我不知道你是否能解决这个问题,但是如果你的董事会确实有一个局域网接口(或者你可以用USB到以太网适配器构建一个局域网接口),那么调试似乎是有可能的!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14584504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档