调试内核模块的方法有很多。最常用的,可能也是上手难度最低的就是使用prinfk打印出相关的调试信息,但是总给人的感觉不够geeek,所以这里描述一种能够使用gdb+qemu来调试内核的方法。

启动虚拟机

/data/bin/qemu-system-x86_64 -m 6144 -M accel=kvm -cpu host -smp 4 -nographic \

-kernel /root/code/linux-4.18.2/arch/x86/boot/bzImage \

-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x6,drive=drive-virtio-disk1,id=virtio-disk0,disable-modern=off,disable-legacy=on \

-drive format=raw,if=none,id=drive-virtio-disk1,cache=directsync,file=/data/rootfs.img,aio=native \

-netdev tap,id=tap0,ifname=virbr0-nic,vhost=no,script=no \

-device virtio-net-pci,netdev=tap0 \

-append "root=/dev/vda rw console=ttyS0 nokaslr" -enable-kvm -S -gdb tcp::8889

当进入到虚拟机之后,启动相关的网卡,可以方便的向虚拟机中拷贝相关需要的文件,方便调试。

内核模块实例

使用以下链接 中内核模块,作为调试示例。

如果调试的目标虚拟机是Ubuntu16.04,使用如下分支:

git clone -b build-for-ubuntu16046 https://github.com/caisan/simplefs

如果是centos7 作为调试的目标虚拟机主机,使用如下分支:

git clone -b build-for-centos7 https://github.com/caisan/simplefs

为了能在Guest中编译simplefs文件系统,需要在Guest中编译下Linux-kernel 4.18.2,但是不是完全编译,只需要编译所需要的kernel headers,module依赖。

进入到Guest中:

cd linux-4.18.2

make menuconfig

make modules - j4

make modules_install -j4

上述编译结束后,到Guest 的路径下:/lib/modules/4.18.2下确认下,不出意外用ls -al可以看到build和source都链接到/root/linux-4.18.2,如下:

然后再进入到simplefs, 执行编译此simplefs模块:

make

随后加载该simplefs.ko模块。注意如果是在centos7上加载此模块,需要先加载jbd2,即就是:modprobe jbd2

调试的虚拟机我选的Ubuntu 16.04.6,内核版本是

如下:

insmod ./simplefs.ko

cat /sys/module/simplefs/sections/.text

0xffffffffc098f000

cat /sys/module/simplefs/sections/.data

0xffffffffc0992000

cat /sys/module/simplefs/sections/.bss

0xffffffffc0992580

以上通过.text, .data, .bss定位到了模块的加载地址,可以使用这三个信息开始我们的调试。

在Host上调试内核。

以上将基于QEMU+kvm中的Guest安装好了,现在在Host上进行调试工作。这里说在Host上其实不太准确,调试的目标是Guest kernel上的模块,Host上执行相当于是GDB远程调试,whatever,意会这个意思就可以了。但是请务必将Host上调试的kernel代码和Guest上的版本保持一致。

以我为例,我Host上kernel代码路径是在/root/code/linux-4.18.2

因此可以在~/.gdbinit 中添加如下内容:

add-auto-load-safe-path /root/code/linux-4.18.2/scripts/gdb/vmlinux-gdb.py

target remote:8889

(这里要强调的是,Host上的kernel同样是经过编译过后的)

进入到已经编译好的kernel源码目录:

gdb ./vmlinux

此时进入到了gdb中,由于我们调试的simplefs.ko模块,因此还要在gdb中加载这个模块,注意:这里的加载和使用insmod加载有区别,两者都要做。

将Guest中网络设置好之后,可以将在Guest中编译好的simplefs.ko模块拷贝出来,下面.text``.data``.bss相关的地址和在Guest中保持一致。

(gdb) add-symbol-file ./simplefs.ko 0xffffffffc098f000 -s .data 0xffffffffc0992000 -s .bss 0xffffffffc0992580

加载好之后就可以调试了。

触发调试。

这里以调试mount的操作为例,在Guest中执行常规的挂载mount 操作,如下:

dd bs=4096 count=100 if=/dev/zero of=image

./mkfs-simplefs image

mount -o loop -t simplefs image /root/simplefs/mount/

或者采用以下方式设置挂载:

fallocate -l 1G disk.img

losetup -f /root/disk.img

取消挂载:

losetup -D

然后在Host的gdb中设置断点:

(gdb) b simplefs_fill_super

(gdb) c

等待触发到breakpoint。调试命令和gdb使用相同。

gdb 调试kvm虚拟机_GDB+QEMU调试内核模块(实践篇)相关推荐

  1. java 调试js_Java与JS代码调试技巧

    断点的分类,断点可以到到类名上,变量行上,方法名上. java源码上可以打断点,断点打到方法头上,编译的时候断点信息不会被去除掉,编译后的class文件 在debug模式下运行,可以触发断点,挂起线程 ...

  2. linux filesystem_如何使用cgdb + qemu调试linux内核模块

    如何使用cgdb + qemu调试linux内核模块 前言 Linux 代码庞大而繁杂,光看代码会使人头晕目眩,如果能通过调试工具对其代码执行流程进行调试,则对学习Linux kernel以及解决平时 ...

  3. Proxmox VE 6.0管理指南——10. Qemu / KVM虚拟机

    10. Qemu / KVM虚拟机 Qemu(Quick Emulator的缩写)是一个模拟物理计算机的开源虚拟机管理程序.从运行Qemu的主机系统的角度来看,Qemu是一个用户程序,可以访问许多本地 ...

  4. Eclipse CDT+Qemu调试Linux 0.11内核

    操作系统:CentOS 6.3 for 32bit 需要软件:eclipse-cpp-galileo-SR2-linux-gtk.tar.gz qemu 需要内核文件:linux 0.11(Makef ...

  5. WIN10 + VS2015 + WDK10 + SDK10 + VM虚拟机驱动开发调试环境搭建

    为什么80%的码农都做不了架构师?>>>    一.准备工作 1 系统环境:Win10系统 2 开发工具:VS2015 3 驱动开发工具:WDK10 4 Windows SDK:SD ...

  6. gdb的简单使用和gdb+gdbserver方式进行ARM程序调试

    gdb的简单使用 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但如果你是在 UNIX平台下做软件,你会发现GDB ...

  7. KVM虚拟机IO处理过程(二) ----QEMU/KVM I/O 处理过程

    接着KVM虚拟机IO处理过程中Guest Vm IO处理过程(http://blog.csdn.net/dashulu/article/details/16820281),本篇文章主要描述IO从gue ...

  8. GDB调试多进程程序或同时调试多个程序

    转自:http://hellogcc.blogbus.com/logs/71170939.html 在以前,如果在GDB中想调试多进程的程序,需要在fork以前"set follow-for ...

  9. QEMU/KVM虚拟机Win11黑屏问题解决

    ArchLinux系统下,通过qemu/kvm虚拟机环境安装的win11(UEFI+GPT),8月份以来一直使用正常.最近看到一个错误想纠正(如下图),考虑到可能是权限问题,便将win11的qcow2 ...

最新文章

  1. 如何判断一个元素在亿级数据中是否存在?
  2. CSDN下载资源+全领域电子书+程序员提升课,领取这些不香吗?
  3. Web GIS系统相关
  4. (52)系统调用阶段测试——基于 SSDT HOOK 的 FindWindowA 监视器
  5. 自动化运维之 部署Saltstack 并批量部署 Nginx
  6. Oracle就业课第四课之子程序
  7. SqliteHelper整理
  8. 关于在hue当中执行定时任务,时间的设置。
  9. 大数据开发 | MapReduce介绍
  10. C++每日练笔之时间类(基类)
  11. 使用纯代码进行界面布局
  12. Node.js新手教程——怎样实现文件上传功能
  13. 【OpenCV】图像金字塔详解及编程实现
  14. 游戏筑基开发之结构体定义动态数组及常见问题(C语言)
  15. ubuntu20.04安装微信
  16. javaWeb框架开发
  17. SpringBoot和Hprose集成开发
  18. 深度学习策略之图像预处理
  19. unity制作和输出摄像机环绕动画
  20. 不得不看的经典软件测试面试问题

热门文章

  1. python3语音控制电脑_python语音控制电脑_uusee全屏
  2. java难度_你们觉得java难吗?
  3. mysql解压版怎么添加服务_Windows系统下MySQL添加到系统服务方法(mysql解压版)
  4. 安装activemq
  5. 在Blazor中构建数据库应用程序——第2部分——服务——构建CRUD数据层
  6. (一)边缘AI:口罩检测
  7. Visual Studio Code 1.44 发布
  8. MsSql.RestApi - 构建ASP.NET REST API的最简单方法
  9. blob js 下载word乱码_这几个相见恨晚的PDF转换成Word技巧,请收好
  10. qt checkbox 选中事件_Qt基础知识学习