vscode GDB 调试linux内核 head.S

遇到的问题

此前参考如下文章

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

已经完成了在ubuntu 虚拟机用vscode 调试linux 内核。但是美中不足的是,断点最早只能加在__primary_switched() 函数。无法停在更早的断点上,比如ENTRY(stext) 位置。参考《奔跑吧linux 内核(第2版)》卷2,3.1.5节如下位置,可以在gdb -tui 中从 ENTRY(stext) 开始单步调试,但是远不如vs code 方便。于是在vs code 官方文档中寻找方法。

解决方法

参考官方文档 https://code.visualstudio.com/docs/cpp/launch-json-reference,有stopAtConnect 参数。其作用是在connect 后立即停止。因此,修改launch.json如下:

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

先运行如下qemu 启动命令,注意要有 -S 参数

bash 复制代码
qemu-system-aarch64 -m 512M -smp 1,sockets=1,cores=1 -cpu cortex-a57 -machine virt -kernel kernel/linux-5.4.220/arch/arm64/boot/Image -append "rdinit=/linuxrc nokaslr console=ttyAMA0 loglevel=8" -nographic -s -S

后在vs code 中执行add-symbol-file 等操作即可,如下

相关推荐
keyipatience23 分钟前
5种IO模型与阻塞IO,select,poll,epoll,LT和ET模式
linux·服务器·网络·数据结构·c++·算法
Dream Cosmos41 分钟前
C++ 中 static 关键字的作用与使用规则
linux·c++
一技安身9 小时前
【Docker】 镜像导出 & 导入,实验环境aarch64(arm64)Linux操作系统
linux·docker·容器
代码村新手10 小时前
Linux调试器-gdb的使用
linux
新时代牛马11 小时前
PCI与PCIe 硬件原理、配置空间/BAR 与 Linux 驱动完整篇:从 LTSSM、TLP 到 ECAM 与probe
java·linux·服务器
两点王爷12 小时前
解决 Linux 中 version `CXXABI_1.3.8‘ not found 报错
linux·运维·服务器
xx~t12 小时前
嵌入式——51单片机1
linux·c语言·单片机·嵌入式硬件·51单片机
啦啦啦啦啦zzzz12 小时前
利用RAII机制进行日志的采集
linux·服务器·c++·网络编程·c++20
0+11112 小时前
Linux --线程概念与控制
linux·运维·服务器·jvm
nLif13 小时前
基于GTK的简易MFC对话框兼容层 -- MfcToGTK
linux·c++·mfc·gtk