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

dee*_*dee 3 gdb kgdb

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

主持人:运行Windows + VMshare + Ubuntu

目标:运行Linux内核3.19.有一个MINI USB端口充当串口,我认为它(CP210x uart到usb)

连接1:主机(USB到DB9 male-PL2303)+ DB9母对母+(DB9公对USB)目标.

连接2:主机(USB) - 电缆 - (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 > _
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

我尝试过的实验

  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,当我在主机上执行"target remote/dev/ttyUSB0"时,我会注意到目标上的垃圾字符.所以有一些通信发生,所以尝试不同的波特率仍然是相同的问题.这是否表明我的设置存在任何内在错误?
  5. 在许多在线论坛/文档中,当内核进入kdb提示符时,我看不到"由于键盘输入而输入kdb".这不寻常吗?

Dav*_* Hu 7

远程kgdb调试的设置有点单调乏味.kgdb有几个先决条件/限制.我会试着把它分解.

您必须在此设置中准备两台机器.
主机:安装了代理程序代理和GDB的位置.
TARGET:正在调试的Linux系统.

连接设置

[Host /dev/ttyUSB0] USB to Serial --------- COM port [Target /dev/ttyS0]
Run Code Online (Sandbox Code Playgroud)

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

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

[Target] stty -F /dev/ttyS0 115200
[Host] stty -F /dev/ttyUSB0 115200
Run Code Online (Sandbox Code Playgroud)

确保串行连接在两个方向上都能正常工作.您可以使用:

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

[Target] cat /dev/ttyS0
[Host] echo 'from HOST to TARGET' > /dev/ttyUSB0
Run Code Online (Sandbox Code Playgroud)

您应该在机器的两侧看到消息.如果没有,则电缆或驱动器可能存在一些问题.

编译内核

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
Run Code Online (Sandbox Code Playgroud)

这将重定向:

  • TARGET的主机控制台:5550
  • TARGET的kgdb监听端口为HOST:5551

开始调试

首先,打开主控台:

[Host] telnet localhost 5550
Run Code Online (Sandbox Code Playgroud)

进入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
Run Code Online (Sandbox Code Playgroud)

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

console=tty0 console=ttyS0,115200 kgdbwait kgdboc=ttyS0,115200
Run Code Online (Sandbox Code Playgroud)

TARGET机器一旦闯入kdb就会立即停止.
同时,您将在主控制台上看到kdb提示符:

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

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

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)
Run Code Online (Sandbox Code Playgroud)

享受内核调试!