怎样使用qemu+kgdb调试linux系统

利用qemu+kgdb调试Linux系统

author:Ewan

  1. 在Guest上编译并安装需要debug的内核,需要将以下选项加入编译配置中。

CONFIG_DEBUG_KERNEL=y
CONFIG_DEBUG_INFO=y
CONFIG_CONSOLE_POLL=y
CONFIG_KDB_CONTINUE_CATASTROPHIC=0
CONFIG_KDB_DEFAULT_ENABLE=0x1
CONFIG_KDB_KEYBOARD=y
CONFIG_KGDB=y
CONFIG_KGDB_KDB=y
CONFIG_KGDB_LOW_LEVEL_TRAP=y
CONFIG_KGDB_SERIAL_CONSOLE=y
CONFIG_KGDB_TESTS=y
CONFIG_KGDB_TESTS_ON_BOOT=n
CONFIG_MAGIC_SYSRQ=y
CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1
CONFIG_SERIAL_KGDB_NMI=n

注意:

  • 理论上也可以通过在Host上编译内核(因为Guest上的编译实在是太慢了),然后将整个源码目录拷贝到Guest中去,再进行安装。但是经过实验,这样操作会导致新编译的内核无法启动,不知道哪里出了问题。

  • 以上选项加入编译配置肯定没有问题,但我在5.3.8的编译中,使用默认选项(5.3.8默认使能了KGDB),也能最终使用KGDB编译该内核。

  1. 将Guest中的内核源码目录传输到Host上,因为之后gdb要从该目录启动,使用该目录的vmlinux,我使用的传输媒介为网桥,需要配置网桥,配置网桥方案见文档"qemu使用网桥模式"
  2. 利用qemu启动Guest
sudo qemu-system-x86_64 -smp 4 -m 4096 -hda ubuntu18_04.img -enable-kvm -serial tcp::1234,server,nowait
  1. 在Guest的启动选项中,选择Advanced Options,然后在需要debug的kernel版本上按e,编辑该内核的启动项,加入:
kgdbwait kgdboc=ttyS0,115200 nokaslr

然后按F10, 启动该内核。

  1. 在Host上,之前从Guest传输过来的内核源码目录下,启动gdb
gdb -ex 'file vmlinux' -ex 'target remote localhost:1234'

然后在gdb中,输入c,并回车

  1. 在Guest中,输入
sudo echo g > /proc/sysrq-trigger

然后就会发现Guest卡住了,回到Host看gdb所在的terminal,发现gdb可以操作了,之后就可以使用该gdb对内核进行debug了。


__EOF__

本文作者EwanHai
本文链接https://www.cnblogs.com/haiyonghao/p/14440777.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   EwanHai  阅读(998)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示