我遇到主机和目标之间的串行和USB连接问题。以下是我的设置。主机和目标都没有任何串行(DB9)端口。
主机:运行Windows + VMshare + Ubuntu
目标:运行Linux内核3.19。有一个MINI USB端口充当串口,我认为它(CP210x uart to usb)
连接1:主机(USB到DB9 male-PL2303)+ DB9母对母+(DB9公对USB)目标。
连接2:主机(USB) - 电缆 - (USB迷你)目标
主机(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
我试过的实验
问题
答案 0 :(得分:6)
远程kgdb调试的设置有点单调乏味。 kgdb有几个先决条件/限制。我会试着把它分解。
您必须在此设置中准备两台机器
主机:代理商代理商&amp;已安装GDB。
TARGET:正在调试的Linux系统。
[Host /dev/ttyUSB0] USB to Serial --------- COM port [Target /dev/ttyS0]
在TARGET方面,无法使用kgdb的USB接口。这是因为所有USB串行驱动程序(CP210x,PL2303 ......等)都没有实现polling hook。您必须直接使用串行电缆连接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
这将重定向:
首先,打开主控台:
[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)
享受内核调试!