gdb 调试kvm虚拟机_GDB+QEMU调试内核模块(实践篇)
调试内核模块的方法有很多。最常用的,可能也是上手难度最低的就是使用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调试内核模块(实践篇)相关推荐
- java 调试js_Java与JS代码调试技巧
断点的分类,断点可以到到类名上,变量行上,方法名上. java源码上可以打断点,断点打到方法头上,编译的时候断点信息不会被去除掉,编译后的class文件 在debug模式下运行,可以触发断点,挂起线程 ...
- linux filesystem_如何使用cgdb + qemu调试linux内核模块
如何使用cgdb + qemu调试linux内核模块 前言 Linux 代码庞大而繁杂,光看代码会使人头晕目眩,如果能通过调试工具对其代码执行流程进行调试,则对学习Linux kernel以及解决平时 ...
- Proxmox VE 6.0管理指南——10. Qemu / KVM虚拟机
10. Qemu / KVM虚拟机 Qemu(Quick Emulator的缩写)是一个模拟物理计算机的开源虚拟机管理程序.从运行Qemu的主机系统的角度来看,Qemu是一个用户程序,可以访问许多本地 ...
- Eclipse CDT+Qemu调试Linux 0.11内核
操作系统:CentOS 6.3 for 32bit 需要软件:eclipse-cpp-galileo-SR2-linux-gtk.tar.gz qemu 需要内核文件:linux 0.11(Makef ...
- WIN10 + VS2015 + WDK10 + SDK10 + VM虚拟机驱动开发调试环境搭建
为什么80%的码农都做不了架构师?>>> 一.准备工作 1 系统环境:Win10系统 2 开发工具:VS2015 3 驱动开发工具:WDK10 4 Windows SDK:SD ...
- gdb的简单使用和gdb+gdbserver方式进行ARM程序调试
gdb的简单使用 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但如果你是在 UNIX平台下做软件,你会发现GDB ...
- KVM虚拟机IO处理过程(二) ----QEMU/KVM I/O 处理过程
接着KVM虚拟机IO处理过程中Guest Vm IO处理过程(http://blog.csdn.net/dashulu/article/details/16820281),本篇文章主要描述IO从gue ...
- GDB调试多进程程序或同时调试多个程序
转自:http://hellogcc.blogbus.com/logs/71170939.html 在以前,如果在GDB中想调试多进程的程序,需要在fork以前"set follow-for ...
- QEMU/KVM虚拟机Win11黑屏问题解决
ArchLinux系统下,通过qemu/kvm虚拟机环境安装的win11(UEFI+GPT),8月份以来一直使用正常.最近看到一个错误想纠正(如下图),考虑到可能是权限问题,便将win11的qcow2 ...
最新文章
- 如何判断一个元素在亿级数据中是否存在?
- CSDN下载资源+全领域电子书+程序员提升课,领取这些不香吗?
- Web GIS系统相关
- (52)系统调用阶段测试——基于 SSDT HOOK 的 FindWindowA 监视器
- 自动化运维之 部署Saltstack 并批量部署 Nginx
- Oracle就业课第四课之子程序
- SqliteHelper整理
- 关于在hue当中执行定时任务,时间的设置。
- 大数据开发 | MapReduce介绍
- C++每日练笔之时间类(基类)
- 使用纯代码进行界面布局
- Node.js新手教程——怎样实现文件上传功能
- 【OpenCV】图像金字塔详解及编程实现
- 游戏筑基开发之结构体定义动态数组及常见问题(C语言)
- ubuntu20.04安装微信
- javaWeb框架开发
- SpringBoot和Hprose集成开发
- 深度学习策略之图像预处理
- unity制作和输出摄像机环绕动画
- 不得不看的经典软件测试面试问题
热门文章
- python3语音控制电脑_python语音控制电脑_uusee全屏
- java难度_你们觉得java难吗?
- mysql解压版怎么添加服务_Windows系统下MySQL添加到系统服务方法(mysql解压版)
- 安装activemq
- 在Blazor中构建数据库应用程序——第2部分——服务——构建CRUD数据层
- (一)边缘AI:口罩检测
- Visual Studio Code 1.44 发布
- MsSql.RestApi - 构建ASP.NET REST API的最简单方法
- blob js 下载word乱码_这几个相见恨晚的PDF转换成Word技巧,请收好
- qt checkbox 选中事件_Qt基础知识学习