通过 USB 和串行连接的 KGDB 远程调试连接问题

KGDB remote debugging connection issue via USB and Serial connection

我在主机和目标之间的串行和 USB 连接方面遇到问题。下面是我的设置。主机和目标都没有任何串行 (DB9) 端口。

主机:运行 windows + VMshare + Ubuntu

目标:运行 linux 内核 3.19。有一个用作串行端口的 MINI usb 端口,我认为它(CP210x uart 到 usb)

连接 1:主机(USB 到 DB9 公头-PL2303)+ DB9 母头到母头 +(DB9 公头到 USB)目标。

连接 2:主机 (USB) --电缆-- (USB mini) 目标

主机(ubuntu 虚拟机)可以将 USB 设备(两种连接类型)识别为 /dev/ttyUSB0。该设备不会显示在 windows 设备管理器中,因为 VM 接管了设备控制权。

目标引导进入 UEFI shell。我修改 syslinux.cfg 文件以将 "kgdbwait kgdboc =ttyS0, 115200" 附加到 APPEND 标志。保存更改(按 F2)然后退出(按 F3)。启动到图像。 Target 现在进入带有以下消息的 kdb 提示

kgdb: Waiting for connection from remote gdb...
Entering kdb ( current= <64bit address>, pid 1) on processor 0 due to Keyboard Entry
Kgdb > _

在主机端,我执行以下命令,下面是错误

root@ubuntu: cd /images
root@ubuntu: sudo gdb ./vmlinux
Reading symbols from ./vmlinux done.
(gdb)
(gdb) target remote /dev/ttyUSB0
Remote debugging using /dev/ttyUSB0
Ignoring packet error, continuing...
warning: unrecognized item "timeout" in "qSupported" response
Ignoring packet error, continuing...
Ignoring packet error, continuing...
Bogus trace status reply from target: timeout

我尝试过的实验

  1. 在主机上我使用了“target remote /dev/ttyS0”,仍然是同样的问题
  2. 在上述每个连接(1 和 2)中尝试了不同的电缆
  3. on Target 删除了 UEFI syslinux.cfg 文件中的编辑 shell,启动映像并使用 "echo g > /proc/sysrq-trigger"
  4. 进入 kgdb
  5. 所有与 KGDB* 相关的内核配置,KGDB_SERIAL*,KGDB_USB* 已启用
  6. 所有可用波特率

问题

  1. 如果我使用 "kgdbwait kgdboc=ttyUSB0, 115200" 而不是“kgdbwait kgdboc=ttyS0, 115200”,目标会 NOT 停止。当目标完全启动并出现登录提示时,我可以看到设备在使用连接 1 时被识别为 ttyUSB0。但是,因为它没有停止,这是否意味着使用 USB 的 KGDB 不起作用?或者对于 USB 调试,我需要使用直接 USB--USB 线(连接 3)?
  2. syslinux.cfg支持USB调试吗?因为有一个 SERIAL 标志,其值为“0, 115200”,其中 0 指的是 ttyS0。 syslinux 文档没有任何 USB 类型设备的值。
  3. 使用连接 2,为什么我会看到超时和数据包错误问题
  4. 偶尔在连接 2 上,当我在主机上执行“target remote /dev/ttyUSB0”时,我注意到目标上有乱码。所以发生了一些通信,所以尝试了不同的波特率仍然是同样的问题。这是否表明我的设置存在任何固有错误?
  5. 在许多在线论坛/文档中,当内核进入 kdb 提示符时,我没有看到 "entering kdb due to keyboard entry"。这不寻常吗?

远程kgdb调试的设置有点繁琐。 kgdb 有几个 prerequisites/limitations 可以工作。我会尝试分解它。

在这个设置中你必须准备两台机器。
HOST: 安装了 agent-proxy 和 GDB 的地方。
TARGET: 正在调试的 Linux 系统。

连接设置

[Host /dev/ttyUSB0] USB to Serial --------- COM port [Target /dev/ttyS0]

在 TARGET 端,无法将 USB 接口与 kgdb 一起使用。这是因为所有的USB-Serial驱动(CP210x, PL2303, ...etc) did not implement the polling hook。你必须直接用串口线连接COM口。在HOST端使用USB接口是可以的。既然是串口连接,你必须使用 USB 转串口转换器并在主机上安装正确的驱动程序。

设置合适的双方波特率:

[Target] stty -F /dev/ttyS0 115200
[Host] stty -F /dev/ttyUSB0 115200

确保串行连接双向有效。您可以使用:

[Host] cat /dev/ttyUSB0
[Target] echo 'from TARGET to HOST' > /dev/ttyS0

[Target] cat /dev/ttyS0
[Host] echo 'from HOST to TARGET' > /dev/ttyUSB0

您应该会在机器的两侧看到消息。如果不是,可能是网线或驱动有问题。

编译内核

在内核配置中启用 KGDB* , KGDB_SERIAL*, KGDB_USB*, DEBUG_INFO, DEBUG_INFO_DWARF4, MAGIC_SYSRQ。在 TARGET 上编译和安装。

此处的主要目的是启用 KGDB 功能并在 vmlinux 中保留调试信息。

代理代理设置

agent-proxy 充当目标串行端口的代理。它拆分串行端口以进行多路复用。一个用于主控制台 I/O,另一个用于 GDB 会话。因此,我们可以同时处理这两个问题。你应该 运行 HOST 机器上的 agent-proxy。

git clone http://git.kernel.org/pub/scm/utils/kernel/kgdb/agent-proxy.git
cd agent-proxy ; make
./agent-proxy 5550^5551 0 /dev/ttyUSB0,115200

这将重定向:

  • TARGET 的控制台到 HOST:5550
  • TARGET 的 kgdb 侦听端口 HOST:5551

开始调试

首先,打开主控制台:

[Host] telnet localhost 5550

通过以下任一方式进入 kdb 模式:

[Target] echo ttyS0,115200 > /sys/module/kgdboc/parameters/kgdboc
[Target] dmesg | tail
(you should see KGDB: Registered I/O driver kgdboc, otherwise it failed)

[Target] echo g >/proc/sysrq-trigger

或者,通过在 TARGET 的引导加载程序中添加以下内核参数(用于早期内核调试):

console=tty0 console=ttyS0,115200 kgdbwait kgdboc=ttyS0,115200

TARGET 机器一旦闯入 kdb 将立即停止。
同时,你会在主控制台看到一个kdb提示:

....
Entering kdb (current=0xcb846c80, pid 2301) on processor 3 due to Keyboard Entry
[3]kdb>

键入 kgdb 然后输入。 TARGET 现在正在等待远程 GDB 的连接。我们将从主机连接它。

Host> gdb vmlinux
(gdb) target remote localhost:5551
Remote debugging using localhost:5551
kgdb_breakpoint () at kernel/debug/debug_core.c:1072
1072             wmb(); /* Sync point after breakpoint */
(gdb)

祝您内核调试愉快!