我们在内核调试的时候,会有很多方法,比如printk, ftrace, kprobe, ebpf和gdb等。比起其他的方法,gdb可以单步运行代码,实时获取变量信息等优势。但劣势也比较明显,比如效率较低,比较适合代码较少,操作简便,场景单一的情况。

编译内核

本实验采用x86的内核,需要增加打开CONFIG_BLK_DEV_RAM选项,并将CONFIG_BLK_DEV_RAM_SIZE设置为65535,以便于使用qemu启动,方法如下:

make menuconfig

进入Device drivers --> Block devices

选中RAM block device support

构建根文件系统

1)下载busybox

  • wget http://www.busybox.net/downloads/busybox-1.35.0.tar.bz2  --no-check-certificate
  • tar xvjf busybox-1.35.0.tar.bz2

2)编译busybox

  • make menuconfig
  • 在Settings中选中“Build static binary”

  • make

3)制作rootfs

  • dd if=/dev/zero of=rootfs.img bs=1M count=20
  • mkfs.ext4 rootfs.img
  • mkdir fs
  • sudo mount -t ext4 -o loop rootfs.img ./fs
  • sudo make install CONFIG_PREFIX=./fs
  • cd fs/
  • sudo mkdir proc dev etc home mnt
  • sudo cp -r ../examples/bootfloppy/etc/* etc/
  • sudo mkdir /sys
  • 修改etc/fstab为如下内容:
proc        /proc   proc    defaults    0   0
tmpfs       /tmp    tmpfs   defaults    0   0
sysfs       /sys    sysfs   defaults    0   0
tmpfs       /dev    tmpfs   defaults    0   0
debugfs     /sys/kernel/debug   debugfs defaults    0   0

到此,我们得到了我们新制作的根文件系统rootfs.img

安装gdb工具

我使用的是优麒麟系统,所以键入命令“sudo apt-get install gdb gdb-multiarch”

使用qemu启动内核,我的qemu启动脚本为

#!/bin/bash
qemu-system-x86_64  \-cpu kvm64 \-smp 2 \-m 1024M \-kernel ./linux-objtrace-jeff-v15/arch/x86_64/boot/bzImage \-qmp unix:/tmp/mem/qemu/qmp,server,nowait \-gdb unix:/tmp/mem/qemu/gdb,server,nowait \-nographic \-append "root=/dev/ram0 rw rootfstype=ext4 console=ttyS0 init=./linuxrc nokaslr" \-initrd ./rootfs_x86_64.img

使用gdb调试内核

1)启动gdb

sudo gdb-multiarch --tui vmlinux (其中vmlinux为编译好的内核elf文件)

2) 连接内核

target remote /tmp/mem/qemu/gdb

3) 设置断点

b __kprobe_trace_func

本节我们使用一个比较典型的gdb场景,调试kprobe代码,因为kprobe本身属于ftrace的一部分,所以不能使用ftrace来调试kprobe,gdb比较合适。

4) continue (或直接运行c)

让内核继续运行起来。

5) 在内核中输入如下命令,进入断点

cd /sys/kernel/debug/tracing/
echo 1 > events/kprobes/p_vfs_open_0/enable
cat trace

6) 常用调试命令

单步命令:n

进入调用函数内部:s

查看当前函数参数:i args

查看局部变量:i locals

查看单独变量: p variable

查看结构中每一项的值: p *pointer

查看结构定义:ptype struct (ptype /o code还可以查看结构中每一项地址的offset)

查看指定区域的内存内容x/32 addr(读取addr后32个64bit数据)

本例中函数store_trace_args将字符串”trace”放到了entry中,我们查看了entry后面的内存内容,找到了字符串”trace”的ascii,即“74,72,61,63,65”。

查看调用栈:bt

反汇编函数:disas function_name

查看反汇编指令:x/3i $pc

单步调试汇编:ni

查看寄存器:info register rdi (i register rdi)

基本就是这些,虽然不像eclipse, visual studio那样可以使用鼠标操作,但熟练之后效率也不会低的。

qemu+gdb调试内核相关推荐

  1. qemu+gdb调试linux内核

    文章目录 编译内核 下载qemu 构建initramfs根文件系统 1.编译Busybox 2.生成initrd 3.测试根文件系统 gdb调试内核 参考文献 编译内核 # make menuconf ...

  2. QEMU+GDB调试方法

    两年前调试usb/ip开源项目时,就曾用虚拟机远程调试过Windows和Linux系统内核,当时在VMware Workstation上创建两个虚拟机进行调试,也没有记录下如何配置调试,只是大体的还记 ...

  3. Qemu gdb 调试 Liteos realview-pbx-a9 工程

    目录 调试环境准备 gdb 调试方法 调试环境准备 实验操作系统:ubuntu 18.04.5.准备如下环境: 下载 huawei liteos, 并按照官方文档.编译 realview-pbx-a9 ...

  4. 利用QEMU+GDB搭建Linux内核调试环境

    前言 对用户态进程,利用gdb调试代码是很方便的手段.而对于内核态的问题,可以利用crash等工具基于coredump文件进行调试. 其实我们也可以利用一些手段对Linux内核代码进行gdb调试,qe ...

  5. gdb 调试kvm虚拟机_GDB+QEMU调试内核模块(实践篇)

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

  6. 学内核之二:基于QEMU搭建Linux内核运行调试环境

    目录 一 接续上文 二 编译根文件系统 三 构建完善根文件系统 四 内核中指定根文件系统 五 带根文件系统启动内核 一 接续上文 在上一篇文章中,我们展示了通过QEMU仿真软件来运行Linux内核的过 ...

  7. qemu debug linux内核,在QEMU环境中使用GDB调试Linux内核

    简介 对用户态进程,利用gdb调试代码是很方便的手段.而对于内核态的问题,可以利用crash等工具基于coredump文件进行调试.其实我们也可以利用一些手段对Linux内核代码进行gdb调试,qem ...

  8. qemu debug linux内核,qemu调试linux内核

    2012.03.19 网上时间过早的讲编译内核的文章完全不用看,比如什么讲kgdb的,现在这个东西早就被集成到内核里了.还有调试内核的一些允许kernel debugging的选项,在新版本中也早已是 ...

  9. 通过gdb调试分析Linux内核的启动过程

    作者:吴乐 山东师范大学 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.实验流程 1.打开环境 执 ...

最新文章

  1. 附庸风雅(2006-10-20 13:39:32)(新浪)
  2. 如何用vue-router为每个路由配置各自的title
  3. Perl、PHP、Python、Java和Ruby的比较(来自知乎)
  4. 荆门 php,荆门php培训
  5. [FFT/IFFT]快速傅里叶(逆)变化 + 递归和递推模板
  6. Android Camera调用流程
  7. 统计每天的数据 无数据也要显示日期程序解决方法
  8. 全球AI挑战-场景分类的比赛源码(多模型融合)
  9. php获取客户端的真实IP的方法
  10. Struts 1与Struts 2区别
  11. 浏览器访问127.0.0.1已拒绝连接
  12. 【Linux】——用户账号和组账号
  13. 【_declspec(dllimport)】_declspec(dllimport)
  14. win7-32位系统SqlServer2014版本下载与安装
  15. Chrome的一些快捷键
  16. 谷歌浏览器,查找CSS选择器
  17. Windows 10的TPM模块到底是不是美国全球监控体系的奠基石?
  18. 不规则现金流 java设计_第三节不规则现金流的计算
  19. 《open-falcon入门教程二》open-falcon安装
  20. 基于pytorch的softmax分类器

热门文章

  1. 6道常见Linux运维面试题讲解!
  2. 问题来了、、挖掘机技术哪家强?问题又来了、、
  3. ShareX(图片文件分享程序)V11.1.0中文版
  4. 天声同化oracle,PLOS COMPUT BIOL:Glucoracle——糖尿病患者控制血糖的好帮手!
  5. cell:胸腺类器官技术使ips细胞变为T细胞,使无限T细胞供应成为可能
  6. 谷牛期权在资产风险管理中的作用
  7. 员工管理书籍推荐,做好员工管理看这些书就够了
  8. 解决笔记本开机D、E(硬盘)消失不见问题
  9. 辽宁本溪:群猴趁动物园搬迁出逃闯进市长办公室
  10. ProXmoX下使用QM命令部署黑群晖DSM6.1.7