在vmware虚拟机A上
1 2 | apt install libssl-dev apt install libncurses-dev |
从文后链接中下载kernel源码,比如版本4.15.18,解压编译
1 2 3 4 | make menuconfig make make modules_install make install |
A关机,克隆A为B,A的虚拟机设置中增加串口
1 2 3 | 使用命名管道:\\.\pipe\com_1 该端是服务器。 另一端是虚拟机。 |
B的虚拟机设置中增加串口
1 2 3 | 使用命名管道:\\.\pipe\com_1 该端是客户端。 另一端是虚拟机。 |
A以新编译的内核引导,可能事先要加大内存;B以旧内核引导。在B中运行
1 | cat < /dev/ttyS1 |
在A中运行
1 | echo Helloworld > /dev/ttyS1 |
如果B中回显消息,说明串口连通。
编辑A中的/boot/grub/grub.cfg,找到新编译内核启动项,在handoff后加入kgdbwait kgdboc=ttyS1,115200 nokaslr,如
1 | linux /boot/vmlinuz-4.15.18 root=UUID=7ccc722d-2cbd-4597-a367-e0635333ddbf ro quiet splash $vt_handoff kgdbwait kgdboc=ttyS1,115200 nokaslr |
B退出cat程序,A重启以新编译的内核引导到kdb等待状态。在B中kernel源码根目录运行
1 2 3 4 5 | gdb vmlinux set serial baud 115200 target remote /dev/ttyS1 lx-symbols c |
A中进入系统后可用下面语句触发调试
1 2 3 | #echo 1 > /proc/sys/kernel/sysrq #echo kms,kbd > /sys/module/kgdboc/parameters/kgdboc echo g > /proc/sysrq-trigger |
vmware串口调试提速的方法为,关掉此虚拟机,编辑启动文件.vmx,加入
1 | serial1.pipe.charTimePercent = "25" |
其中serial1要因时而变,要查找同文件中是否有同样名称。
运行后很稳定的话,还可将25再改小再试。
注1:因为新内核的KASLR机制,如果在内核启动命令行中不加入nokaslr,调试时看到不到堆栈也下不了断点。Cannot insert breakpoint。
注2:因为源地址无法访问了,有个未尝试的点摘抄下来
1 2 3 | 在没有编译内核的情况下,还可以直接通过修改虚拟机的启动文件.vmx,添加: debugStub.listen.guest32 = "TRUE" 然后在调试机器中通过:target remote ip:8832(8864)来调试,ip为真实机器的IP |
refer to:
https://mirrors.edge.kernel.org/pub/linux/kernel/
https://stackoverflow.com/questions/49360506/in-kgdb-i-cannot-set-the-breakpoint
https://askubuntu.com/questions/964540/gdb-qemu-cant-put-break-point-on-kernel-function-kernel-4-10-0-35
https://www.cnblogs.com/xiaofool/p/5377737.html
https://docs.vmware.com/en/VMware-Workstation-Pro/12.0/com.vmware.ws.using.doc/GUID-B285C62D-1E7E-49E8-81D6-77910B2024A6.html