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

《Linux内存管理:实验驱动的深度探索》【附录】【实验环境搭建 2】【vscode搭建调试内核环境】

1. 如何调试我们的内核

1. GDB调试

  1. 安装gdb
sudo apt-get install gdb-multiarch

gdb-multiarch是多架构版本,可以通过set architecture aarch64指定架构

  1. QEMU参数修改添加-s -S
#!/usr/bin/sh

qemu-7.2.0-rc1/build/aarch64-softmmu/qemu-system-aarch64 \
    -nographic \
    -M virt \
    -cpu cortex-a57 \
    -smp 2 \
    -m 1G \
    -kernel linux-6.0.9/build/arch/arm64/boot/Image \
    -append "nokaslr root=/dev/ram init=/linuxrc console=ttyAMA0 console=ttyS0" \
    -initrd initrd.ext4 \
    -s -S

-s 表示启用 GDB 服务,-S 表示启动时停止 CPU,等待 GDB 连接。

-s 可以指定调试端口,如 -s tcp::8888。没有指定的默认情况下,端口号是 1234

执行上述脚本
在这里插入图片描述

进入内核目录linux-6.0.9/build执行

gdb-multiarch --tui vmlinux

其中,–tui(Text User Interface) 用于启用 TUI 模式

cd linux-6.0.9/build
gdb-multiarch --tui vmlinux


(gdb) set architecture aarch64
The target architecture is set to "aarch64"

# 连接gdbserver
(gdb) target remote localhost:1234
Remote debugging using localhost:1234

# 设置断点
(gdb) b start_kernel
Breakpoint 1 at 0xffff000011bf0470 (2 locations)

# 运行
(gdb) c

在这里插入图片描述

2. VSCode调试

我们虽然可以使用 gdb的方式来调,但是 还是不太方便。这里我们继续使用 vscode 来搭建调试环境。

确保写安装C/C++插件
在这里插入图片描述

在这里插入图片描述

  • 在 launch.json 中添加如下内容
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Linux-6.0.9",
            "type": "cppdbg",
            "request": "launch", 
            "program": "/home/leo/data_4t/cbx/qemu_linux_6.0.9_arm64/linux-6.0.9/build/vmlinux",//vmlinux路径
            "args": [],//启动参数,如果需要记录日志可以自己增加参数。因为gdbsever已经有了参数,这里可以不用设置
            "stopAtEntry": true,//会自动停在main,不需要则设置为false
            "cwd": "${workspaceRoot}",
            "environment": [],
            "externalConsole": true,
            "MIMode": "gdb", //运行模式
            "logging": {
                "moduleLoad": false,
                "engineLogging": false,
                "trace": false
            },
            "setupCommands": [ //命令
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "set architecture aarch64",
                    "text": "set architecture aarch64",
                    "ignoreFailures": true
                }
            ],
            "miDebuggerPath":"gdb-multiarch",//工具链gdb
            "miDebuggerServerAddress":"localhost:1234"//远程端口

        }
    ]
}

vmlinux路径按照实际情况修改保存。

先在终端执行qemu,再vscode内打开代码打断点init/main.c:934,现在就可以运行了

在这里插入图片描述

2. 调试注意点

需要注意的是:内核只能用O2编译,很多变量都被优化了,不很方便。

可用下面方法来局部O0编译:


 // 写在文件开头,O0编译本文件
#pragma GCC optimize ("O0") 

// 写在函数开头,O0编译本函数
__attribute__((optimize("O0"))) 

这样如果遇到需要单步执行,或者看一些变量信息,会更加的方便。

  • https://www.cnblogs.com/qmjc/p/14698328.html
  • https://developer.aliyun.com/article/215591

3. 总结

  • 通过 qemu 结合 vscode调试, 就可以顺利开始我们的 linux 内存管理 的学习了。

相关文章:

  • 做面食的网站企业网络推广平台
  • dw网站模板免费seo基础教程使用
  • 1高端网站建设北京网络推广
  • 网站漂浮百度广告联盟价格
  • 加强普法网站建设的通知杭州seo搜索引擎优化
  • 网站建设回龙观ui设计培训班哪家好
  • Gemini 2.5 Pro与Claude 3.7 Sonnet编程性能对比
  • UE5学习笔记 FPS游戏制作38 继承标准UI
  • 如何本地部署DeepSeek:从零实现AI模型私有化部署
  • 【Java SE】Math类、System类
  • 【Ragflow】10. 助理配置参数详细解析/模型响应加速方法
  • 开源的 LLM 应用开发平台Dify的安装和使用
  • SQL 查询执行顺序
  • js逆向入门图灵爬虫练习平台 第四题学习
  • Java 二叉树非递归遍历核心实现
  • 【技术报告】GPT-4o 原生图像生成的应用与分析
  • A股复权计算_前复权数据计算_终结章
  • 【高校主办】2025年第四届信息与通信工程国际会议(JCICE 2025)
  • rnn的音频降噪背后技术原理
  • Python星球日记专栏介绍(持续更新ing)
  • 六.FFmpeg对mp4文件操作(ubuntu)
  • 【WampServer】Windows本地部署WampServer环境并实现远程访问服务界面
  • WPS宏开发手册——Excel实战
  • stm32 主频216MHz,写个ms延时函数,us延时函数
  • 不绕弯地解决文件编码问题,锟斤拷烫烫烫
  • 将java生成dex并通过app_process执行的教程