https://zhuanlan.zhihu.com/p/4185359719

本文发布于微信公众号:Linux底层小工,欢迎关注,获取更多原创技术文章!

“VSCode+qemu+gdb调试OpenSBI确实很爽,那怎能少了调试kernel呢~~”

01 VScode调试MMU开启之前的kernel

有了调试OpenSBI的基础,再调试kernel,那设置相当简单了,如果你还没看过VSCode调试OpenSBI,请先查看另一篇文章:《VSCode+qemu+gdb可视化调试OpenSBI》

现在让我们来配置调试kerenl,先在VSCode中远程打开kernel目录

然后点击debug图标:

然后点击create a launch.json file:

选择Node.js:

然后输入如下内容:

{
// 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": [
{
"name": "kernel-before-mmu-debug",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/vmlinux",
"args": [],
"stopAtEntry": true,
"stopAtConnect": true,
"cwd": "${workspaceFolder}",
"postRemoteConnectCommands": [
{
"description": "remove symbol file",
"text": "symbol-file"
}
{
"description": "add symbol file",
"text": "add-symbol-file vmlinux 0x80202000 -s .head.text 0x80200000 -s .init.text 0x80c00000 -s .rodata 0x81000000"
}
],
"MIMode": "gdb",
"miDebuggerPath":"/usr/bin/gdb-multiarch",
"miDebuggerServerAddress": "localhost:1234"
}
]
}

注意,其中的program就是vmlinux的路径,还有postRemoteConnectCommands要在连接之后先使用symbol-file命令将vscode启动gdb时默认加载的symbol清除掉,然后再使用add-symbol-file命令将各个段的symbol添加到指定位置(这些位置怎么计算来的,请观看RISC-V篇-qemu+gdb调试Linux kernel源码),否则后面debug时会有问题,比如,设置断点,会命中多个地址等

现在可以在VSCode中调试了,先在VSCode中打开终端,并启动qemu:

然后分别点击debug按钮,Start Debugging按钮:

启动debug之后,如下图:

现在打开head.S文件,可以直接在代码的左侧点击设置断点,或者在DEBUG CONSOLE下输入 -exec b xxx 设置断点,如下图,左侧红色的小点就是设置的断点:

点击countinue按钮运行:

就会命中断点,左侧还提供了非常丰富的信息:

02 VScode调试MMU开启之后的kernel

有了以上的基础,调试MMU开启之后的kernel就很简单了,只需修改launch.json的配置如下:

{
// 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": [
{
"name": "kernel-before-mmu-debug",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/vmlinux",
"args": [],
"stopAtEntry": true,
"stopAtConnect": true,
"cwd": "${workspaceFolder}",
"MIMode": "gdb",
"miDebuggerPath":"/usr/bin/gdb-multiarch",
"miDebuggerServerAddress": "localhost:1234"
}
]
}

对的,你没有看错,就是删除postRemoteConnectCommands字段即可

启动qemu,启动debugger,设置断点,continue运行,与上面都一样的,这里就省略了,最终运行到start_kernel的效果如下:

其他操作留给你自己探索去吧~~

最后,不得不说,VSCode是真强大啊,再安装上vim插件,用vim命令,简直爽到飞起

俗话说,磨刀不误砍柴工,关于环境设置这一块,其实就是在磨刀,不过截至目前,我感觉环境设置已经基本ok了,对以后的效率会有很大的提升,后面会更多的专注于RISC-V知识的学习了,包括spec文档,代码等~~

敬请期待!!!

如果你觉得本文对你有帮助,请点赞,关注~

本文发布于微信公众号:Linux底层小工,欢迎关注,获取更多原创技术文章!

RISC-V篇-VSCode+qemu+gdb可视化调试Linux Kernel的更多相关文章

  1. ubuntu: qemu+gdb 调试linux kernel 学习笔记

    声明: 本笔记内容并非本人原创,90%来自网络资料的整合.同时,由于自己是刚刚接触qemu & gdbserver remote debug,本文也就算不得教程,仅供有缘人参考而已. ---- ...

  2. GDB+GDBServer调试Linux应用程序

    参考:http://blog.csdn.net/shanghaiqianlun/article/details/7820401 一.gdb+gdbserver总体介绍 远程调试环境由宿主机GDB和目标 ...

  3. Gdb远程调试Linux内核遇到的Bug

    知识共享许可协议本作品采用知识共享署名 4.0 国际许可协议进行许可.转载保留声明头部与原文链接https://luzeshu.com/blog/gdb-bug 本博客同步在http://www.cn ...

  4. Visual Studio 2015中使用gdb远程调试linux程序

    VS的debug功能非常强大,相比而言linux上的图形化调试一直不是很好用. 如果可以使用VS来调试linux程序,应该是一件比较愉快的事情. 这在2015中变得可能,因为从2015开始VS支持An ...

  5. GDB 远程调试Linux (CentOS)

    1.引用: https://blogs.msdn.microsoft.com/vcblog/2016/03/30/visual-c-for-linux-development/ 注意安装gdbserv ...

  6. 用qemu+gdb tcp server+CDT调试linux内核启动-起步

    用qemu+gdb tcp server+CDT调试linux内核启动-起步 说明: 环境信息与 用virtualbox+模拟串口+CDT调试linux内核 TCP IP协议栈-起步 提到的一样,并且 ...

  7. 利用QEMU+GDB搭建Linux内核调试环境

    前言 对用户态进程,利用gdb调试代码是很方便的手段.而对于内核态的问题,可以利用crash等工具基于coredump文件进行调试. 其实我们也可以利用一些手段对Linux内核代码进行gdb调试,qe ...

  8. C++雾中风景番外篇3:GDB与Valgrind ,调试代码内存的工具

    写 C++的同学想必有太多和内存打交道的血泪经验了,常常被 C++的内存问题搅的焦头烂额.(写 core 的经验了)有很多同学一见到 core 就两眼一抹黑,不知所措了.笔者 入"坑&quo ...

  9. 基于TQ2440和Qemu的GDB+串口调试(1)

    作者 彭东林 pengdonglin137@163.com   平台 TQ2440 + Linux-4.10.17 Qemu(vexpress-ca9) + Linux-4.10.17   概述 下面 ...

  10. 在qemu环境中用gdb调试Linux内核

    简介 对用户态进程,利用gdb调试代码是很方便的手段.而对于内核态的问题,可以利用crash等工具基于coredump文件进行调试.其实我们也可以利用一些手段对Linux内核代码进行gdb调试,qem ...

随机推荐

  1. Kubernetes控制器-Job和CronJob

    Job 和 CronJob Deployment, StatefuleSet以及DaemonSet这三个控制器主要编排的对象都是"在线业务",比如我们举例常用的Nginx,MySQ ...

  2. 来公司 3 年,被新来的技术大佬 PUA 了。。。

    大家好,我是程序员鱼皮.最近收到一位鱼友的求助,感觉很有代表性,相信很多技术人都会遇到类似的情况.今天就和大家聊聊这个话题,看看遇到这种情况该怎么办. 鱼友提问 鱼皮哥,求解惑!最近我们公司新来了一个 ...

  3. 开源公开课丨ChengYing安装原理剖析

    一.直播介绍 之前的内容,我们为大家分享了ChengYing入门介绍,以及ChengYing部署Hadoop集群实战,本期我们为大家分享ChengYing安装原理. 本次直播我们将详细介绍ChengY ...

  4. el-popover无法弹出的问题解决

    1.不能再el-popover上⾯使⽤v-if进⾏显⽰隐藏,应该⽤v-show2.在每⼀个el-popover上都增加⼀个ref确定每个el-popover都是唯⼀的,:ref="`node ...

  5. Cursor生成UI,加一步封神

    用 Cursor 做 UI,有两种最简单又有效的方法,一个免费一个付费,不管你要做网页 UI 还是应用程序 UI,都能用. 我这里不推荐直接用 Cursor 自带模型生成 UI,模型生成出来的效果比较 ...

  6. 故障处理:Oracle一体机磁盘故障时磁盘组重平衡失败的故障处理

    最近半个月遇到有两个客户的Oracle Exadata一体机出现物理磁盘的损坏,一个客户是机械磁盘.一个客户是FLASH磁盘.很巧的是这两个客户他们的日常运维过程中都是只看物理服务器的故障信号灯.但是 ...

  7. 利用POI插件导入excel 读取合并行数据(上)

    图为要导入的excel格式 分析一下: 前一部分数据是读取 合并行 存入一张 "会见" 表 ,后面蓝色的 非合并行 存入 "会见人信息" 表. 先说后台方法,( ...

  8. 渗透测试工作站搭建:Kali + Wave + Zsh + Tmux + 工具集整合实践

    前言 在开始任何渗透测试工作之前,搭建一个可靠高效的工作环境至关重要.这包括组织工具.配置系统,以及确保所有必要资源随时可用.通过尽早建立结构良好的测试基础架构,我们可以减少停机时间.最大程度地减少错 ...

  9. socket.io的小例子

    前言 socket.io是原生ws封装的第三方库,它不仅仅对客户端做了封装,还对服务端也进行了封装. 提供了很多能用得到的功能,比如: 断链自动尝试重链 对不支持ws的浏览器做兼容(降级轮循http) ...

  10. CF1905C Largest Subsequence 题解

    CF1905C Largest Subsequence 首先考虑如何生成一个字典序最大的子序列.我们先考虑找到字符串中的最大元素,然后在其之后找到第二大的元素,重复这个过程,直到达到序列末尾. 我们可 ...