0

我对 KGDB 非常陌生,当我从主机连接目标时遇到问题,出现以下错误。

(gdb) 目标远程 /dev/ttyUSB0
使用 /dev/ttyUSB0 进行远程调试
忽略数据包错误,继续...
警告:“qSupported”响应中无法识别的项目“swreak”
警告:“qSupported”响应中无法识别的项目“ReloInsn”
警告:无法识别的项目“QTread”
[3]kdb> " 在 "qSupported" 响应中
来自目标的虚假跟踪状态回复:qTStatus
...

#

我下面的程序是:

[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

(你应该看到 KGDB: Registered I/O driver kgdboc,否则会失败)

[Target] echo g >/proc/sysrq-trigger
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)
#

当我在目标任务中键入 kgdb 时,出现错误,因为权限被拒绝,如下所示

[3]kdb>kgdb
诊断:-22:权限被拒绝

...,我将不胜感激逐步明确的答案...,在此先感谢

4

1 回答 1

0
diag: -22: Permission denied

该错误意味着默认情况下在您的内核中禁止访问调试器功能。为了解锁调试器,您需要执行以下命令:

回声 1 > /sys/module/kdb/parameters/cmd_enable

或添加内核引导参数:

kdb.cmd_enable=1

更多信息在这里

于 2019-08-04T10:11:38.430 回答