Linux内核模块使用GDB + KGDB远程调试,远程'g'数据包回复太长

Linux内核模块使用GDB + KGDB远程调试,远程'g'数据包回复太长

我正在尝试远程调试 Linux 内核,但遇到问题。

我的设置:

  • 目标机器采用 Ubnutu Linux,带有我的自定义内核 4.3,我使用调试信息和 KGDB 构建了该内核。
  • 装有 Windows 和 Cygwin 的开发机。

我在 Linux 端使用串行端口连接机器,在开发机器端使用 USB 连接机器。在目标机器上:我用 insmod 加载了我的模块 X,

>cat /sys/module/X/sections/.text
0xffffffffc046e000 
>cat /sys/module/X/sections/.bss
0xffffffffc04708c0 
>cat /sys/module/X/sections/.data
0xffffffffc0470000

我读到我应该用“一些参数”启动内核,但我不太明白如何在 Ubuntu 中做到这一点,所以我这样做了:

>echo "ttyS0,115200 > /sys/module/kgdboc/parameters/kgdboc

也尝试过这样:

echo ttyS0 > /sys/module/kgdboc/parameters/kgdboc

进而

>echo g > /proc/sysrq-trigger

此时Linux机器死机了,这很好。 (等待gdb)在Windows机器上我打开cygwin,我将vmlinux和Xo文件放在根目录中,并将源代码放在正确的位置。然后我跑了

gdb ./vmlinux - b 115200
(gdb) add-symbol-file byt_adsp21479.o 0xffffffffc046e000 -s .bss 0xffffffffc04708c0 -s .data 0xffffffffc0470000
(gdb) set architecture i386:x86-64:intel

然后我在内核模块中设置了一些断点并运行

(gdb) target remote /dev/ttyS7 which is COM8

有效并且输入后

(gdb) continue

Linux 机器解冻了,但是当我在 Linux 机器上运行应触发断点的操作时,我在开发机器上收到以下消息:

[New Thread 3264]
Ignoring packet error, continuing...
Remote 'g' packet reply is too long: 0840000000000000000e00080847c0ffffffff000100c0000000000300000000000000bc3b63360088ffff0000000000000000a03b63360088ffff983b63360088ffff000063360088ffff2f944e2fbd3b000020c00a360088ffff000000000000000000000000000000000300000000000000000000000000000000ccd7ceff7f0000ede146c0ffffffff4602000010000000180000000000000000000000

最奇怪的是,有一次,我能够进入 2 个函数,但随后我收到了相同的错误消息。可能存在哪些问题?

仅供参考,我已经放弃了通过串口调试,并尝试通过以太网,所以我去了这里http://sysprogs.com/VisualKernel/kgdboe/tutorial/ 并下载并构建了 kgboe,但是当我尝试运行 insmod kgdboe.ko 时出现错误:

insmod: Error: could not insert module kgdboe.ko : Unknown symbol module

当我运行 dmesg 时我看到

kgdboe: Unknown symbol set_memory_rw (err 0)

根据我的设置,任何人都可以帮我找到一种调试内核模块的方法吗?谢谢你!

相关内容