简介

对用户态进程,利用gdb调试代码是很方便的手段。而对于内核态的问题,可以利用crash等工具基于coredump文件进行调试。其实我们也可以利用一些手段对Linux内核代码进行gdb调试,qemu就是一种。qemu是一款完全软件模拟(Binary translation)的虚拟化软件,在虚拟化的实现中性能相对较差。但利用它来在测试环境中gdb调试Linux内核代码,是熟悉Linux内核代码的一个好方法。本文旨在介绍怎么利用qemu搭建Linux的gdb调试环境。其中主要包括了如何编译Linux内核,如何利用gdb远程连接qemu启动的gdbserver,进而进一步进行内核代码调试。

环境

  • Linux Distribution: Ubuntu 14.04.5 TLS
  • 调试内核版本:3.18.6 (本文将内核编译成x86 32位架构来做演示)

编译内核

下载3.18.6版本内核源代码。

# wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.6.tar.xz
# xz –d linux-3.18..tar.xz
# tar –xvf linux-3.18..tar
# cd linux-3.18.

编译选项 

不同的架构有不同的默认文件,比如x86平台,可以在arch/x86/configs找到相关文件:i386_defconfig。通过执行make i386_defconfig 即可基于这个文件生成.config文件,在此基础上可以再运行make menuconfig 来进行个别的调整。更多的细节请参考:Documentation\kbuild\kconfig.txt。 总之,无论怎么配置,最终都是为了生成.config文件。这些宏最终将影响Makefile中参与编译的文件。

代码的编译选项配置很多,这里主要做如下两处配置:

  • 让系统内核在32位架构中运行 //只是为了演示,非必须
  • 开启"Compile the kernel with debug info"选项 //如果要让内核可调试,这个选项必选
# make i386_defconfig //32位架构
# make menuconfig // 调整编译选项

注意:默认make menuconfig会报错如下,因为最小系统不支持图形显示。

# make menuconfig
HOSTCC scripts/kconfig/mconf.o
In file included from scripts/kconfig/mconf.c:::
scripts/kconfig/lxdialog/dialog.h::: fatal error: curses.h: No such file or directory
#include CURSES_LOC
^
compilation terminated.

解决方法:

# apt-get install libncurses5-dev -y

在内核编译选项中,开启如下"Compile the kernel with debug info"

Kernel hacking --->
    Compile-time checks and compiler options --->
        [ ] Compile the kernel with debug info

示意图如下,利用键盘选中debug选项,然后敲"Y"勾选:

在menuconfig中选完编译选项,结果会写入到.config文件中。可以看到.config文件的CONFIG_DEBUG_INFO被设置成Y。

编译

编译选项选完后,利用make编译,编译需要较长时间。

# make -j2

编译完成之后,会有一些新的文件产生,如:

  • linux-3.18.6/arch/x86/boot/bzImage // 相当于/boot目录下vmlinuz,是一个压缩的,可以bootable的Linux kernel文件
  • linux-3.18.6/vmlinux // 一个非压缩的,不可以bootable的Linux kernel文件。是用来生成bzImage/vmlinuz的中间步骤。

qemu

安装qemu

# apt-get update
# apt-get install qemu
# 因为用的32位平台环境,所以用下面的qemu
# ln -s /usr/bin/qemu-system-i386 /usr/bin/qemu

qemu主要选项解释:

  • -kernel bzImage: Use bzImage as kernel image. The kernel can be either a Linux kernel or in multiboot format. // 指定可以bootable的内核压缩文件
  • -initrd file: use 'file' as initial ram disk // 指定initramdisk
  • -append cmdline: use 'cmdline' as kernel command line // 指定kernel cmdline
  • -S: Do not start CPU at startup (you must type 'c' in the monitor). // 用于调试代码
  • -s: Shorthand for -gdb tcp::1234, i.e. open a gdbserver on TCP port 1234. // 开启一个gdbserver, 可以通过TCP端口1234连接
  • -nographic: Normally, QEMU uses SDL to display the VGA output. With this option, you can totally disable graphical output so that QEMU is a simple command line application. The emulated serial port is redirected on the console and muxed with the monitor (unless redirected elsewhere explicitly). // 默认qemu使用图形方式,该现象可以启用非图形方式

利用gdb调试

利用qemu启动编译好的内核,如下:

# qemu -kernel linux-3.18./arch/x86/boot/bzImage -s -S -append "console=ttyS0" -nographic

在本机另一个terminal利用gdb连接本地的gdbserver 1234端口

# gdb
# (gdb) file linux-3.18./vmlinux //load Linux符号表
Reading symbols from linux-3.18./vmlinux...done.
# (gdb) target remote:1234 //远程连接监听在TCP 1234的gdb server
(gdb) break start_kernel //在start_kernel函数设置断点
Breakpoint at 0xc1a2f7c5: file init/main.c, line .
(gdb) c //continue,继续执行代码

在继续执行后,最终qemu的输出如下,在qemu虚拟机里运行的Linux系统能成功启动,并且最终以Kernel panic宣告结束。看到call trace打出来的是在initrd_load的时候出错,原因很简单,因为启动系统的时候只指定了bzImage,没有指定initrd文件,系统无法mount上initrd (init ram disk) 及其initramfs文件系统。

到此为止,gdb调试Linux内核代码的基本环境已经搭建完成,可以利用断点来调试启动启动中的细节。后面将介绍如何构建initramfs文件系统,能让qemu运行的Linux系统更像“完整的系统”。

在qemu环境中用gdb调试Linux内核的更多相关文章

  1. Vmware+gdb调试Linux内核——工欲善其事,必先利其器

    今天我最终忍受不了qemu的低速跟不可理喻的各种bug,開始寻找新的调试内核的方法.然后想到了Vmware,那么成熟的虚拟机怎么可能调试不了内核.于是尝试了一番,发现结果很的棒!所以立刻奋笔疾书.把这 ...

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

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

  3. Gdb远程调试Linux内核遇到的Bug

    知识共享许可协议本作品采用知识共享署名 4.0 国际许可协议进行许可.转载保留声明头部与原文链接https://luzeshu.com/blog/gdb-bug 本博客同步在http://www.cn ...

  4. 用qemu+gdb tcp server+CDT调试linux内核启动-起步

    用qemu+gdb tcp server+CDT调试linux内核启动-起步 说明: 环境信息与 用virtualbox+模拟串口+CDT调试linux内核 TCP IP协议栈-起步 提到的一样,并且 ...

  5. 学习构建调试Linux内核网络代码的环境MenuOS系统

    构建调试Linux内核网络代码的环境MenuOS系统 一.前言 这是网络程序设计的第三次实验,主要是学习自己编译linux内核,构建一个具有简易功能的操作系统,同时在系统上面进行调试linux内核网络 ...

  6. 使用QEMU调试Linux内核代码

    http://blog.chinaunix.net/uid-20729583-id-1884617.html http://www.linuxidc.com/Linux/2014-08/105510. ...

  7. VELT-0.1.5开发:使用kgdb调试Linux内核【转】

    转自:http://demo.netfoucs.com/lights_joy/article/details/44106589 VELT的全称是Visual EmbedLinuxTools,它是一个与 ...

  8. 跟踪调试Linux内核的启动过程

    跟踪调试Linux内核的启动过程---使用gdb 符钰婧 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/UST ...

  9. 使用 ftrace 调试 Linux 内核【转】

    转自:http://blog.csdn.net/adaptiver/article/details/7930646 使用 ftrace 调试 Linux 内核,第 1 部分 http://blog.c ...

随机推荐

  1. 高效使用jquery之一:请使用'On'函数

    on函数是在jquery 1.7 加入的 描述: 在选定的元素上绑定一个或多个事件处理函数. 定义:.on( events [, selector ] [, data ], handler(event ...

  2. Sql Server 逻辑文件 '' 不是数据库 '' 的一部分。请使用 RESTORE FILELISTONLY 来列出逻辑文件名。

    当使用语句还原数据库时,报如下错误: 消息 3234,级别 16,状态 2,第 29 行逻辑文件 'LenborMealOrder_Base_2017' 不是数据库 'Members_01' 的一部分 ...

  3. window下卸载MySQL

    更多内容推荐微信公众号,欢迎关注: 网上找来的,留在这做个备份. 1.控制面板里的增加删除程序内进行删除 2.删除MySQL文件夹下的my.ini文件,如果备份好,可以直接将文件夹全部删除 3.开始- ...

  4. hdu 1716 排列2(DFS搜索)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1716 排列2 Time Limit: 1000/1000 MS (Java/Others)    Me ...

  5. VUE和ES6资源收集

    MDN https://developer.mozilla.org/zh-CN/docs/Web/JavaScript https://developer.mozilla.org/en/docs/We ...

  6. 5 - django-csrf-session&cookie

    目录 1 CSRF跨站请求伪造 1.1 CSRF攻击介绍及防御 1.2 防御CSRF攻击 1.2.1 验证 HTTP Referer 字段 1.2.2 在请求地址中添加 token 并验证 1.2.3 ...

  7. js API

    从基础知识JS-web-API js基础知识:ECMA 262标准 js-web-API: w3c标准 W3c标准中关于js的规定有 DOM操作.BOM操作.事件绑定.ajax请求(包括http协议) ...

  8. 3.Springboot之修改启动时的默认图案Banner

    一.SpringBoot的默认启动图案 在SpringBoot启动的时候,默认的会展示出一个spring的logo,这个图案我们用户是可以自定义的 二.自定义启动图案 方法一: Application ...

  9. jupyter(ipython notebook) 安装和入门教程

    近期大家无论是自己做数据分析还是紧急答辩做PPT,可能都需要画一些数据的展示图:以前大家都是用excel画图,但excel画图存在一定的局限性,比如你要画个累积直方图,excel就很麻烦了,所以给大家 ...

  10. Git简明教程二、开始进行版本管理

    上一篇介绍了Git中的一些基本概念.本篇来实际看一看如何通过几个常用命令来快速上手Git,完成版本管理的日常操作(核心操作). 0. 准备工作 安装Git后,请先在你的电脑上新建或选择一个目录作为测试 ...