Linux 内核调试
系列文章目录
Linux内核学习
Linux 知识
QEMU 虚拟机
Linux 调试视频
近阶段补充知识
WSL Ubuntu
文章目录
- 系列文章目录
- 一、WSL
- 二、QEMU
- 1、安装
- 2、退出
- 三、构建根文件系统
- 1、下载 BusyBox
- 2、编译
- 3、构建
- 文件目录:
- Makefile
- init
- 四、内核编译
- 1、下载
- 2、构建
- 五、调试
- 1、GDB 命令调试
- 2、VSCode 调试
- (1)解决代码报红
- (2)launch.json
一、WSL
# 查看系统状态
wsl -l -v
# 关闭系统
wsl --shutdown Ubuntu-18.04
# 导出当前Linux的镜像
wsl --export Ubuntu-18.04 D:\wsl-ubuntu\Ubuntu-18.04.tar
# 注销当前的系统
wsl --unregister Ubuntu-18.04
# 从镜像重新导入系统
wsl --import Ubuntu-18.04 D:\wsl-ubuntu\Ubuntu-18.04 D:\wsl-ubuntu\Ubuntu-18.04.tar # 设置默认登录用户
C:\Users\<user name>\AppData\Local\Microsoft\WindowsApps\ubuntu1804.exe config --default-user xiaoming
二、QEMU
1、安装
sudo apt install qemu-system-arm qemu-system-x86
2、退出
先按 Ctrl + A ,再按 X
三、构建根文件系统
1、下载 BusyBox
BusyBox 官网 下载
2、编译
make menuconfig
# 配置选择:
# settings => Build Options => Build static binary (no shared libs) make -j12
make install# 安装的文件在当前 _install 下
BusyBox编译时出错
3、构建
文件目录:
# 制作RamFs(RootFs文件夹,主要为busybox和init文件)
├── bzImage
├── initramfs.img
├── Makefile
└── rootfs├── bin├── init├── linuxrc -> bin/busybox├── sbin└── usr
Makefile
bzImagePath=/home/liuqz/work/linux/linux-6.12.7/arch/x86/bootimage:cp ${bzImagePath}/bzImage ./ramfs:cd ./rootfs && find . -print0 | cpio -ov --null --format=newc | gzip -9 > ../initramfs.imgrun:qemu-system-x86_64 \-kernel ${bzImagePath}/bzImage \-initrd initramfs.img \-m 1G \-nographic \-append "earlyprintk=serial,ttyS0 console=ttyS0 nokaslr"debug:qemu-system-x86_64 \-kernel ${bzImagePath}/bzImage \-initrd initramfs.img -m 1G -nographic \-S -s \-append "earlyprintk=serial,ttyS0 console=ttyS0 nokaslr"# -gdb tcp::9000 # 指定 gdb 服务端点号
# -S 在开始时阻塞 CPU 运行
# -s 开启 GDB 服务,端口 1234
# nokaslr 4.x 以后版本禁止内核地址空间布局随机
init
#!/bin/busybox sh/bin/busybox echo "Hello Linux"/bin/mount -t proc none /proc/bin/mknod /dev/tty2 c 4 2
/bin/mknod /dev/tty3 c 4 3
/bin/mknod /dev/tty4 c 4 4/bin/busybox sh
四、内核编译
1、下载
Linux kernel 官网
如何下载Linux Kernel历史版本
2、构建
# make help
# sudo apt install flex bison
make x86_64_defconfig
make menuconfig
# 优化可选
# Device Drivers => Sound card support
Kernel hacking => Compile-time checks and compiler options => => Debug information => Rely on the toolchain's implicit default DWARF version
Kernel hacking => printk and dmesg options => Default console loglevel => 15# sudo apt-get install libelf-dev
make -j12
编译后文件 System.map 和 vmlinux 。
五、调试
1、GDB 命令调试
# 启动内核
make debug#调试内核
gdb vmlinux # 根下的vmlinux
# 连接远端gdb端口
target remote :1234
# 设置断点
break start_kernel # 可通过System.map查看断点地址和信息
continue
GDB常用命令
命令 | 含义 |
---|---|
r | 重新执行 |
q | 退出gdb |
n | 下一步 |
c | 继续执行 |
b 普通断点 | 打断点 【普通断点】b file.c :行号 【条件断点】b file.c : 行号 if num == 2 【查看断点】info b 【删除断点】del 2 【禁用/启用】disable / enable 2 |
watch 观察断点 | 【监控num】watch num 当被监控变量/表达式的值发生改变时,程序停止运行 【查看观察断点】info watchpoints 监控局部变量num:一旦num失效,则监控操作也随即失效。 监控指针变量*p: watch *p表示监控p所指数据的变化情况;watch p表示监控p指针本身是否改变指向。 监控数组a[10]中的元素:watch a表示只要数组a中元素发生改变,程序就会停止执行。 |
catch 捕捉断点 | |
bt | 查看函数调用堆栈信息,用于发生段错误时,追踪错误 |
display | 【频繁查看变量】display num 程序每暂停一次(遇断点或单步调试),自动打印变量num值 【禁用/启用】disable / enable display num |
list | 默认显示当前行的上5行和下5行的源代码 |
2、VSCode 调试
(1)解决代码报红
- 生成 compile_commands.json
# 生成 compile_commands.json
./scripts/clang-tools/gen_compile_commands.py
- 配置 c_cpp_properties.json
.vscode
下c_cpp_properties.json
可以使用 CTRL + SHIFT + P 选择 C/C++: Edit Configurations,创建 c_cpp_properties.json 文件。
// c_cpp_properties.json
{"configurations": [{"name": "Linux","includePath": ["${workspaceFolder}/**"],"defines": [],"compilerPath": "/usr/bin/gcc","cStandard": "c17","cppStandard": "c++14","intelliSenseMode": "linux-clang-x64","compileCommands": "${workspaceFolder}/compile_commands.json"}],"version": 4
}
(2)launch.json
.vscode
下 launch.json
,配置调试信息。
// launch.json
{// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387"version": "0.2.0","configurations": [{"name": "gdb debug","type": "cppdbg","request": "launch",// "miDebuggerServerAddress": "172.18.25.30:1234","miDebuggerServerAddress": "127.0.0.1:1234","program": "${workspaceRoot}/vmlinux","args": [],"stopAtEntry": false,"cwd": "${workspaceFolder}","environment": [],"externalConsole": false,"logging": {"engineLogging": false},"MIMode": "gdb"}]
}
☆