【1000个GDB技巧之】如何在远端服务器打开通过vscode动态观测Linux内核实战篇?

Step: 配置ssh的服务端host

(也可以直接在vscode中配置,忽略)
主要步骤:在~/.ssh/config中添加服务端的host,以便vscode的remote中能够登录
详细配置过程参考兄弟篇文章:ssh config如何配置用host名替代root@1.1.1.1

Step: vscode刷新远端服务器,并且点击打开

在这里插入图片描述
初次使用remote功能,需要在远端安装一个ssh的代理,需要耗费一定时间。

Step: 配置远端服务器安装C/C++的插件已支持debug功能在这里插入图片描述

Step: 测试插件可用性

添加一个调试配置文件launch.json
在这里插入图片描述

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "C++ Launch (GDB)",
            "type":"cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/test/1",
            "args": ["args1", "args2"],
            "environment": [{"name": "config", "value": "value"}],
            "cwd": "${workspaceFolder}"
    ]
}

写一个C语言的测试进行实验测试:(注意调试的配置在workspace的.vscode目录的launch.json中)
在这里插入图片描述
C代码:

#include "stdio.h"

int abc = 100;
int main(void)
{
    for (int i = 0; i < 100; i++) {
        abc = i;
        printf("abc: %d\n", abc);
    }

    return 0;
}

文件创建好以后点击调试:
在这里插入图片描述
点击后C/C++ debug工具会自动编译和启动gdb进行调试:
在这里插入图片描述
添加断点,执行几个单步调试后,在两个地方通过-exec执行结果能够正确打印数据在这里插入图片描述
如此,gdb通过vscode测试通过。下一步启动远端vmlinux的debug

Step: 添加远端vmlinux的launch配置

启动前需要远端能够在命令行就能支持vmlinux,这里只介绍通过vscode的,具体前置准备配置命令行的参考兄弟篇文章:如何不用vmlinux也能用gdb调试linux内核模块以及调试linux内核?Linux内核中KASLR功能是什么?有什么作用?怎么破除?以及如何实操?
下面假设前置工作均已做好,添加一个launch的配置,核心原理是把vmlinux当做一个用户态程序,支持需要指定内存(这也是C语言的魅力所在)
依次点击添加配置:
在这里插入图片描述
选择:gdb启动这个
在这里插入图片描述
然后自动生成后修改对应参数,修改后注意json文件语法正确性。
修改后的launch代码:

//launch.json 每次系统重启后注意修改其中的symbol部分代码
{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "debug vmlinux",
            "type": "cppdbg",
            "request": "launch",
            "program": "/usr/lib/debug/lib/modules/4.18.0-372.9.1.an8.x86_64/vmlinux",
            "args": [""],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "coreDumpPath": "/proc/kcore",
            "setupCommands": [ //这里设置各种参数的,类似启动的时候, 输入给执行程序的, 比如设置一些环境参数
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "将反汇编风格设置为 Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                },
                {
                    "description": "add ko symbol",
                    "text": "add-symbol-file /path/to/your/ko.ko -s .text 0x12345678 -s .data 0x12345678",
                    "ignoreFailures": true
                },
                {
                    "description": "modify vmlinux symbol, 注意修改前需要symbol-file去掉老的table",
                    "text": "add-symbol-file  /usr/lib/debug/lib/modules/4.18.0-372.9.1.an8.x86_64/vmlinux -s .data 0xffffffff87400000 -s .text 0xffffffff85e00000",
                    "ignoreFailures": true
                }
            ],
        },
        {
            "name": "C++ Launch (GDB)",
            "type":"cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/test/1",
            "args": ["args1", "args2"],
            "environment": [{"name": "config", "value": "value"}],
            "cwd": "${workspaceFolder}"
        }
    ]
}

在gdb的命令行输入添加新的符号,需要先去掉原来的symbol-file重新加载

-exec symbol-file
-exec add-symbol-file  /usr/lib/debug/lib/modules/4.18.0-372.9.1.an8.x86_64/vmlinux -s .data 0xffffffffa8c00000 -s .text 0xffffffffa7600000
-exec p vm_numa_stat[3].counter

备注:vm_numa_stat[3].counter 是linux内核的一个全局变量,作为一个参考。为什么选择它,主要考虑2个点,不同内核版本稳定,运行中值不容易变化,调试确认方便
实操结果:
在这里插入图片描述
可以看到打印的值是30385,和命令行的一致。
在这里插入图片描述

后记

使用gdb命令行与vscode模式是一种比较绕的方式,在某些场景比较有实战价值。全过程操作依赖相当多前置动作,参考文中提到的文章。另外要达到最后的成功需要经过很多摸索稍有不慎就可能出错,不过把我C语言编译、链接、运行的本质,就没什么大的问题。

  • 13
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 VS Code 中使用 GDB 调试 Linux 内核源码的步骤如下: 1. 安装插件:首先需要在 VS Code 中安装插件 "Native Debug",该插件提供了对 GDB 的支持。 2. 配置工作目录:在 VS Code 中打开 Linux 内核源码所在的目录,并在 VS Code 中打开一个终端,进入到内核源码目录中。 3. 生成内核配置:使用 "make menuconfig" 命令生成内核配置,可以根据需要选择需要编译的内核模块。 4. 编译内核:使用 "make -j4" 命令编译内核,其中 "-j4" 表示使用 4 个线程进行编译。 5. 启动 GDB:在终端中输入 "gdb ./vmlinux" 命令启动 GDB,其中 "vmlinux" 是内核文件名。 6. 配置 GDB:在 GDB 中输入以下命令进行配置: * "set architecture i386:x86-64:intel":设置架构为 x86-64。 * "set sysroot /usr/src/linux":设置系统根路径为内核源码路径。 * "file vmlinux":设置内核文件名。 * "target remote :1234":连接到远程目标,端口号为 1234。 7. 启动虚拟机:在另一个终端中启动虚拟机,使用以下命令: ``` qemu-system-x86_64 -s -S -kernel arch/x86/boot/bzImage -nographic ``` 其中 "-s" 表示开启 GDB 服务器,"-S" 表示启动时暂停虚拟机,"-kernel" 指定内核文件名,"-nographic" 表示不使用图形界面。 8. 调试内核:在 GDB 中输入 "continue" 命令,让虚拟机继续执行,即可开始调试内核。 在调试过程中,可以使用 GDB 提供的各种命令进行调试,例如 "break" 设置断点,"step" 单步执行,"print" 打印变量值等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值