Kernel 内核调试【转】
转自:https://www.cnblogs.com/int80/p/10340282.html
本机环境 Win7 + VMware 14 Pro
1.安装Qemu,Ubuntu包管理器中的二进制版本比较老了,这里选择源码安装2.12.0版本。
具体的安装教程可以参考这篇文章《QEMU 2.10.1 编译安装》,写的非常详细。
2.下载、编译目标的内核版本
这里下载的是4.4.1版本的Linux内核 linux-4.4.1.tar.xz
解压 编译
xz - d linux-4.4.1.tar.xz tar -xvf linux-4.4.1.tar cd linux-4.4.1 make menuconfig
确保以下三个选项是勾选上的:
1
2
3
|
kernel hacking –> Kernel debugging kernel hacking –> Compile- time checks and compiler options –> compile the kernel with debug info kernel hacking –> Compile- time checks and compiler options -> compile the kernel with frame pointers |
在多核平台上使用-j 参数来加快编译
1
|
make -j |
3.制作根文件系统
先了解以下几个文件的区别,参考这篇文章
1
2
3
4
5
6
7
|
vmlinux 是ELF文件,即编译出来的最原始的文件。 vmlinuz 应该是由ELF文件vmlinux经过OBJCOPY后,并经过压缩后的文件 zImage 是vmlinuz经过 gzip 压缩后的文件,适用于小内核 bzImage 是vmlinuz经过 gzip 压缩后的文件,适用于大内核 |
新建一个目录用于存放生成的内核文件,以及根文件系统:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
mkdir ~ /Desktop/kernel-debug cp . /arch/x86/boot/bzImage ~ /Desktop/kernel-debug cd ~ /Desktop/kernel-debug dd if = /dev/zero of=rootfs.img bs=1M count=20 #新建一个20M的文件 mkfs -t ext3 rootfs.img #将其格式化为ext3文件系统格式 #将其mount 到新创建到目录rootfs上 mkdir rootfs sudo mount -t ext3 -o loop rootfs.img rootfs #将挂载后的根文件系统中建立基本的目录结构 sudo mkdir rootfs /dev rootfs /proc rootfs /sys |
给系统安装基本的命令行工具,比如ls,这里选择了BusyBox,下载的BusyBox源码
1
2
3
4
5
6
7
8
9
10
|
cd ~ /Desktop/kernel-debug <br> tar -jxvf busybox-1.28.3. tar .bz2<br> cd busybox-1.28.3<br> #进行配置,注意这里选择静态连接的方式生成可执行文件,避免对外部lib有依赖 make menuconfig<br> #勾选Settings->Build Busybox as a static binary make -j #编译完成后,安装到目标的根文件系统中去,然后unmount掉根文件系统 make install CONFIG_PREFIX=~ /Desktop/kernel-debug/rootfs <br> sudo umount ~ /Desktop/kernel-debug/rootfs |
4.启动Qemu虚拟机
1
|
sudo qemu-system-x86_64 -S -kernel ~ /Desktop/kernel-debug/bzImage -hda ~ /Desktop/kernel-debug/rootfs .img -append "root=/dev/sda init=/bin/ash" |
此时启动的Qemu处于Pasued状态,单机黑色区域,让Qemu接收输入,按下ctrl+ alt + 2,切换到控制台。
注意之后可以通过ctrl + alt + G 来让qemu释放鼠标以及键盘输入。
启动gdbserver,监听到8888端口,便于用GDB来远程调试。
5.使用GDB连接到gdbserver进行调试
由于GDB用的不太熟悉,这里使用图形化的调试工具DDD,可以通过以下命令安装:
1
2
3
4
5
|
sudo apt-get install ddd #切换到之前linux编译的目录 cd linux-4.4.1 #选择未压缩的内核文件,读入符号表 ddd vmlinux |
在GDB命令处,连接到Qemu中的GDB server:target remote 127.0.0.1:8888,这个时候Qemu中的Linux系统是处于Paused状态的。
连接之后可以在菜单栏Status-->BackTrace...中看到堆栈信息。
输入continue,让Qemu中的Linux系统运行起来,可以在Qemu中按下ctrl+Alt+1,切换到虚拟机的命令行界面,可以看到这个时候虚拟机已经正常运行起来了。
这里对Linux创建进程的系统调用下断点,观察调用栈:
在fork.c文件中的_do_fork函数处下断点:
切换到Qemu,使用ctrl+Alt+1回到Linux的控制台,运行ls,这时候shell会创建ls进程,这个时候ddd就会断下来了:
原文地址:https://www.cnblogs.com/sky-heaven/p/15123900.html
- iOS一种动态栅格布局方案
- 消息队列中间件 RocketMQ 源码分析 —— Message 存储
- 数据库中间件 MyCAT 源码解析 —— 分片结果合并(一)
- 数据库分库分表中间件 Sharding-JDBC 源码分析 —— SQL 路由(一)之分库分表配置
- 数据库分库分表中间件 Sharding-JDBC 源码分析 —— SQL 解析(六)之删除SQL
- 数据库[分库分表]中间件 Sharding-JDBC 源码分析 —— SQL 解析(五)之更新SQL解析
- ExtJs+WCF+LINQ实现分页Grid
- 数据库[分库分表]中间件 Sharding-JDBC 源码分析 —— SQL 解析(四)之插入SQL
- 基于sliverlight + wcf的web 文字版IM 示例
- 数据库中间件 Sharding-JDBC 源码分析 —— SQL 解析(三)之查询SQL
- zephir-(11)流程控制语句
- phalcon-入门篇7(Model层基础使用)
- Sharding-JDBC 源码分析 —— SQL 解析(二)之SQL解析
- zephir-(1)开篇介绍
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux下将源文件编译成目标文件的过程解析
- Linux使用vim编辑文件保存时报E514:write error (file system full?)问题解决
- Linux下怎么切换使用两个版本的JDK
- Linux下Nginx安装的方法(pcre和openssl)
- Apache设置反向代理的方法
- CentOS7设置定时任务
- linux上安装zookeeper 启动和关闭的教程
- linux中rz上传、sz下载命令详解
- Linux alias命令编写
- 详解linux系统调用原理
- Linux下安装pyenv的方法
- 详解Linux如何生成随机数字和字符串
- linux(ubuntu)用户连续N次输入错误密码进行登陆时自动锁定X分钟
- linux下安装golang的方法
- Linux系统的文件传输方法