![Linux内核模块使用GDB + KGDB远程调试,远程'g'数据包回复太长](https://linux22.com/image/80045/Linux%E5%86%85%E6%A0%B8%E6%A8%A1%E5%9D%97%E4%BD%BF%E7%94%A8GDB%20%2B%20KGDB%E8%BF%9C%E7%A8%8B%E8%B0%83%E8%AF%95%EF%BC%8C%E8%BF%9C%E7%A8%8B'g'%E6%95%B0%E6%8D%AE%E5%8C%85%E5%9B%9E%E5%A4%8D%E5%A4%AA%E9%95%BF.png)
我正在尝试远程调试 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)
根据我的设置,任何人都可以帮我找到一种调试内核模块的方法吗?谢谢你!