3

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

主机:运行 windows + VMshare + Ubuntu

目标:运行 linux kernel 3.19 。有一个充当串行端口的 MINI usb 端口,我认为它(CP210x uart to usb)

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

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

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

目标引导进入 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. 在我使用“目标远程/dev/ ttyS0 ”的主机上,仍然是同样的问题
  2. 在上面提到的每个连接(1和2)中尝试了不同的电缆
  3. on Target 删除 UEFI shell 中 syslinux.cfg 文件中的编辑,启动映像并使用“echo g > /proc/sysrq-trigger”进入 kgdb
  4. 所有与 KGDB* 、 KGDB_SERIAL* 、 KGDB_USB* 相关的内核配置均已启用
  5. 所有可用的波特率

问题

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

1 回答 1

8

远程 kgdb 调试的设置有点繁琐。kgdb 的工作有几个先决条件/限制。我会试着把它分解。

您必须在此设置中准备两台机器。
HOST:代理代理和 GDB 的安装位置。
目标:正在调试的 Linux 系统。

连接设置

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

在 TARGET 方面,无法将 USB 接口与 kgdb 一起使用。这是因为所有 USB-Serial 驱动程序(CP210x、PL2303、...等)都没有实现轮询挂钩。您必须使用串行电缆直接连接 COM 端口。使用 HOST 端的 USB 接口即可。由于它是串行连接,因此您必须使用 USB 转串行转换器并在 HOST 上安装正确的驱动程序。

在两边设置适当的波特率:

[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 充当 TARGET 串行端口的代理。它拆分串行端口以进行多路复用。一个用于主控制台 I/O,另一个用于 GDB 会话。因此,我们可以同时处理两者。您应该在 HOST 机器上运行代理代理。

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 到 HOST:5551 的 kgdb 监听端口

开始调试

首先,打开主控制台:

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

享受您的内核调试!

于 2016-04-26T10:14:13.593 回答