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

qemu + vscode图形化调试linux kernel

一、背景

使用命令行连接gdb 在调试时,虽然可以通过tui enable 显示源码,但还是存在设置断点麻烦(需要对着源码设置),terminal显示代码不方便,不利于我们学习;另外在gdb 下p命令显示结构体内容时,看起来也是很别扭,可以利用vscode+gdb-multiarch 调试qemu 仿真的arm64 linux 内核,这样查看源码,设置断点,查看变量信息也很快捷方便

二、依赖环境

vscode extensions 搜索安装GDB Debug

增加gdb config

json 文件中增加(主要是设置 elf, 以及gdb 的路径,远程gdb连接的端口号)

{// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387"version": "0.2.0","configurations": [{"type": "cppdbg","request": "launch","name": "kernel GDB","program": "${workspaceFolder}/vmlinux","cwd":"${workspaceFolder}","MIMode":"gdb","miDebuggerPath":"/usr/bin/gdb-multiarch","miDebuggerServerAddress": "localhost:1234","stopAtConnect": true,},]
}

三、在vscode中启动调试

如果不知道如何qemu 调试内核的可以参考我之前的文档

无人知晓:qemu搭建arm64 linux kernel调试环境

无人知晓:qemu单步调试arm64 linux kernel

这里有些差异,gdb 加载vmlinux, remote target设置的部分需要换成从vscode设置

第一步启动qemu并等待调试:

qemu-system-aarch64 \-machine virt,virtualization=true,gic-version=3 \-nographic \-m size=1024M \-cpu cortex-a72 \-smp 2 \ -kernel Image \-drive format=raw,file=rootfs.img \-append "root=/dev/vda rw nokaslr" \-s \-S

第二步vscode启动调试 Run->Start Debugging

第三步启动调试,在init/main.c中start_kernel设置断点,然后点击调试工具栏的continue即可触发到断点,可以开启单步调试了

第四步如果在执行过程中连接,也是点击pause按钮,这时内核会停止执行,然后在vscode中设置断点,continue后触发断点vscode能正确显示断点位置及代码

相关文章:

  • 单元/集成测试服务
  • 新建react项目,react-router-dom配置路由,引入antd
  • Go语言中HTTP代理的请求和响应过程
  • 【前端】防抖和节流
  • Orion-14B-Chat-Plugin本地部署的解决方案
  • 图论第三天|127. 单词接龙 841.钥匙和房间 463. 岛屿的周长 1971. 寻找图中是否存在路径 684.冗余连接 685.冗余连接II
  • 活字格V9获取图片失败bug,报错404,了解存储路径,已改为批量上传和批量获取
  • 【网络基础】mac地址
  • 五、Kotlin 函数进阶
  • 数据双向绑定v-modal
  • 分布式ID(4):雪花算法生成ID之Leaf(美团点评分布式ID生成系统)
  • Rollup:打包 TypeScript - React 组件库
  • webassembly003 TTS BARK.CPP
  • Docker 搭建MySQL主从复制-读写分离
  • 【极数系列】Flink集成DataSource读取文件数据(08)
  • #Java异常处理
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • laravel 用artisan创建自己的模板
  • leetcode46 Permutation 排列组合
  • mysql 5.6 原生Online DDL解析
  • mysql innodb 索引使用指南
  • Nodejs和JavaWeb协助开发
  • PAT A1120
  • Python爬虫--- 1.3 BS4库的解析器
  • Python学习之路16-使用API
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • Zsh 开发指南(第十四篇 文件读写)
  • 创建一种深思熟虑的文化
  • 对JS继承的一点思考
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 什么软件可以剪辑音乐?
  • 数据结构java版之冒泡排序及优化
  • 王永庆:技术创新改变教育未来
  • 问题之ssh中Host key verification failed的解决
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • ​Python 3 新特性:类型注解
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (30)数组元素和与数字和的绝对差
  • (二)c52学习之旅-简单了解单片机
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET 表达式计算:Expression Evaluator
  • .NET/C# 的字符串暂存池
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .NET实现之(自动更新)
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • .php结尾的域名,【php】php正则截取url中域名后的内容
  • .so文件(linux系统)