通过 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
我尝试过的实验
- 在主机上我使用了“target remote /dev/ttyS0”,仍然是同样的问题
- 在上述每个连接(1 和 2)中尝试了不同的电缆
- on Target 删除了 UEFI syslinux.cfg 文件中的编辑 shell,启动映像并使用 "echo g > /proc/sysrq-trigger"
进入 kgdb
- 所有与 KGDB* 相关的内核配置,KGDB_SERIAL*,KGDB_USB* 已启用
- 所有可用波特率
问题
- 如果我使用 "kgdbwait kgdboc=ttyUSB0, 115200" 而不是“kgdbwait kgdboc=ttyS0, 115200”,目标会 NOT 停止。当目标完全启动并出现登录提示时,我可以看到设备在使用连接 1 时被识别为 ttyUSB0。但是,因为它没有停止,这是否意味着使用 USB 的 KGDB 不起作用?或者对于 USB 调试,我需要使用直接 USB--USB 线(连接 3)?
- syslinux.cfg支持USB调试吗?因为有一个 SERIAL 标志,其值为“0, 115200”,其中 0 指的是 ttyS0。 syslinux 文档没有任何 USB 类型设备的值。
- 使用连接 2,为什么我会看到超时和数据包错误问题
- 偶尔在连接 2 上,当我在主机上执行“target remote /dev/ttyUSB0”时,我注意到目标上有乱码。所以发生了一些通信,所以尝试了不同的波特率仍然是同样的问题。这是否表明我的设置存在任何固有错误?
- 在许多在线论坛/文档中,当内核进入 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)
祝您内核调试愉快!
我在主机和目标之间的串行和 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
我尝试过的实验
- 在主机上我使用了“target remote /dev/ttyS0”,仍然是同样的问题
- 在上述每个连接(1 和 2)中尝试了不同的电缆
- on Target 删除了 UEFI syslinux.cfg 文件中的编辑 shell,启动映像并使用 "echo g > /proc/sysrq-trigger" 进入 kgdb
- 所有与 KGDB* 相关的内核配置,KGDB_SERIAL*,KGDB_USB* 已启用
- 所有可用波特率
问题
- 如果我使用 "kgdbwait kgdboc=ttyUSB0, 115200" 而不是“kgdbwait kgdboc=ttyS0, 115200”,目标会 NOT 停止。当目标完全启动并出现登录提示时,我可以看到设备在使用连接 1 时被识别为 ttyUSB0。但是,因为它没有停止,这是否意味着使用 USB 的 KGDB 不起作用?或者对于 USB 调试,我需要使用直接 USB--USB 线(连接 3)?
- syslinux.cfg支持USB调试吗?因为有一个 SERIAL 标志,其值为“0, 115200”,其中 0 指的是 ttyS0。 syslinux 文档没有任何 USB 类型设备的值。
- 使用连接 2,为什么我会看到超时和数据包错误问题
- 偶尔在连接 2 上,当我在主机上执行“target remote /dev/ttyUSB0”时,我注意到目标上有乱码。所以发生了一些通信,所以尝试了不同的波特率仍然是同样的问题。这是否表明我的设置存在任何固有错误?
- 在许多在线论坛/文档中,当内核进入 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)
祝您内核调试愉快!