当前位置: 首页 > news >正文

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)解决代码报红

  1. 生成 compile_commands.json
# 生成 compile_commands.json
./scripts/clang-tools/gen_compile_commands.py
  1. 配置 c_cpp_properties.json
      .vscodec_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

.vscodelaunch.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"}]
}

   
 


http://www.mrgr.cn/news/82124.html

相关文章:

  • 25年1月更新。Windows 上搭建 Python 开发环境:PyCharm 安装全攻略(文中有安装包不用官网下载)
  • 图像识别-全连接层-卷积层-卷积层的计算-多输入通道场景-多输出通道场景-感受野-填充-VALID 与 SAME-stride-池化-CNN架构
  • 基于SpringBoot的校园二手交易平台的设计与实现(源码+SQL+LW+部署讲解)
  • Postman[4] 环境设置
  • 【LeetCode】200、岛屿数量
  • 2501d,d的优势之一与C互操作
  • 30天开发操作系统 第 10 天 -- 叠加处理
  • GRAPE——RLHF微调VLA模型:通过偏好对齐提升机器人策略的泛化能力(含24年具身模型汇总)
  • win32汇编环境下,提取对话框程序中,listview列表控件里的内容示例
  • 设计模式 创建型 单例模式(Singleton Pattern)与 常见技术框架应用 解析
  • 点跟踪基准最早的论文学习解读:TAP-Vid: A Benchmark for Tracking Any Point in a Video—前置基础
  • win32汇编环境下,双击窗口程序内生成的listview列表控件的某行,并提取其内容的示例程序
  • 溢出概念总结
  • 基于深度学习的视觉检测小项目(二) 环境和框架搭建
  • MIT Cheetah 四足机器人的动力学及算法 (I) —— 简化动力学模型
  • GeekPad 连接到VirtualBox的Ubuntu虚拟机上的Home-Assistant
  • win32汇编环境下,窗口程序中生成listview列表控件及显示
  • 使用Clion在ubuntu上进行交叉编译,并在Linux上远程编译五子棋
  • UE5 Debug的一些心得
  • 商汤C++开发面试题及参考答案
  • Enum枚举类与静态变量和静态数组的区别
  • 单片机-LED实验
  • Edge如何获得纯净的启动界面
  • 线段树保姆级教程
  • CT 扫描显示 USB-C 电缆可能隐藏复杂的恶意硬件
  • 【paddle】初次尝试