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

news2025/5/24 19:04:47

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语言编译、链接、运行的本质,就没什么大的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1593386.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SpringBoot的“线上教学平台”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“线上教学平台”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 线上教学平台结构图 管理员登录界面图 学员管理界…

【ARM 裸机】汇编 led 驱动之原理分析

1、我们为什么要学习汇编&#xff1f;&#xff1f;&#xff1f; 之前我们或许接触过 STM32 以及其他的 32 位的 MCU ,都是基于 C 语言环境进行编程的&#xff0c;都没怎么注意汇编&#xff0c;是因为 ST 公司早已将启动文件写好了&#xff0c;新建一个 STM32 工程的时候&#…

demo(四)nacosgateway(2)gatewayspringsercurity

一、思路 1、整体思路 用户通过客户端访问项目时&#xff0c;前端项目会部署在nginx上&#xff0c;加载静态文件时直接从nginx上返回即可。当用户在客户端操作时&#xff0c;需要调用后端的一些服务接口。这些接口会通过Gateway网关&#xff0c;网关进行一定的处理&#xff0…

使用云服务器搭建CentOS操作系统

云服务器搭建CentOS操作系统 前言一、购买云服务器腾讯云阿里云华为云 二、使用 XShell 远程登陆到 Linux关于 Linux 桌面下载 XShell安装XShell查看 Linux 主机 ip使用 XShell 登陆主机 三、无法使用密码登陆的解决办法 前言 CentOS是一种基于Red Hat Enterprise Linux&#…

大语言模型总结整理(不定期更新)

《【快捷部署】016_Ollama&#xff08;CPU only版&#xff09;》 介绍了如何一键快捷部署Ollama&#xff0c;今天就来看一下受欢迎的模型。 模型简介gemmaGemma是由谷歌及其DeepMind团队开发的一个新的开放模型。参数&#xff1a;2B&#xff08;1.6GB&#xff09;、7B&#xff…

Python分支结构

我们刚开始写的Python代码都是一条一条语句顺序执行&#xff0c;这种代码结构通常称之为顺序结构。 然而仅有顺序结构并不能解决所有的问题&#xff0c;比如我们设计一个游戏&#xff0c;游戏第一关的通关条件是玩家在一分钟内跑完全程&#xff0c;那么在完成本局游戏后&#x…

[大模型]Baichuan2-7B-chat FastApi 部署调用

Baichuan2 介绍 Baichuan 2 是百川智能推出的新一代开源大语言模型&#xff0c;采用 2.6 万亿 Tokens 的高质量语料训练。在多个权威的中文、英文和多语言的通用、领域 benchmark 上取得同尺寸最佳的效果。 环境准备 在autodl平台中租一个3090等24G显存的显卡机器&#xff0c;…

计算机网络 Cisco静态路由实验

一、实验要求与内容 1、路由器的基本配置 &#xff08;1&#xff09;命名 &#xff08;2&#xff09;关闭域名解析 &#xff08;3&#xff09;设置路由接口IP地址 2、配置静态路由以实现所有客户机都能互相通信 3、配置默认路由 4、了解ping命令和trace&#xff08;跟踪…

各省份自然灾害损失情况数据集(2004-2022年)

01、数据简介 自然灾害是指给人类生存带来危害或损害人类生活环境的自然现象&#xff0c;这些现象是地球演化过程的自然现象。它们主要包括气象灾害、地质灾害、海洋灾害、生物灾害、森林草原火灾等五大类。 具体来说&#xff0c;气象灾害包括干旱、洪涝灾害、台风、风雹、低…

如何在Linux部署MeterSphere并实现公网访问进行远程测试工作

文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网远程访问MeterSphere6. 固定MeterSphere公网地址 前言 MeterSphere 是一站式开源持续测试平台, 涵盖测试跟踪、接口测试、UI 测试和性能测试等功能&am…

软考125-上午题-【软件工程】-传统软件的测试策略

一、传统软件的测试策略 有效的软件测试实际上分为4步进行&#xff0c;即&#xff1a;单元测试、集成测试、确认测试、系统测试。 1-1、单元测试&#xff08;模块测试&#xff09; 单元测试也称为模块测试&#xff0c;在模块编写完成且无编译错误后就可以进行。 单元测试侧重…

Paddle实现人脸对比(二)

我之前发过一篇基于孪生网络的人脸对比的文章&#xff0c;这篇文章也到了百度的推荐位置&#xff1a; 但是&#xff0c;效果并不是很好。经过大量的搜索&#xff0c;我发现了一种新的方法&#xff0c;可以非常好的实现人脸对比。 原理分析 我们先训练一个普通的人脸分类模型&…

【汇编】存储器

存储器 计算机存储器可分为内部存储器&#xff08;又称内存或主存&#xff09;和外部存储器&#xff0c;其中内存是CPU能直接寻址的储存空间&#xff0c;由半导体器件制成 存储单元的地址和内容 计算机存储信息的基本单位是一个二进制位&#xff0c;一位可存储一个二进制数&…

spring boot 集成 flyway依赖 做数据库迁移,让部署没烦恼

flyway 是一个敏捷工具&#xff0c;用于数据库的移植。采用 Java 开发&#xff0c;支持所有兼容 JDBC 的数据库。 主要用于在你的应用版本不断升级的同时&#xff0c;升级你的数据库结构和里面的数据。 还是直接上代码 第一步&#xff1a; <!-- Flyway 数据库迁移 依赖 他…

FJSP:鲸鱼优化算法WOA求解柔性作业车间调度问题(FJSP),提供MATLAB代码

一、柔性作业车间调度问题 柔性作业车间调度问题&#xff08;Flexible Job Shop Scheduling Problem&#xff0c;FJSP&#xff09;&#xff0c;是一种经典的组合优化问题。在FJSP问题中&#xff0c;有多个作业需要在多个机器上进行加工&#xff0c;每个作业由一系列工序组成&a…

【Kafka】Kafka 架构深入

Kafka 工作流程及文件存储机制 Kafka 中消息是以 topic 进行分类的&#xff0c;生产者生产消息&#xff0c;消费者消费消息&#xff0c;都是面向 topic 的。 topic 是逻辑上的概念&#xff0c;而 partition 是物理上的概念&#xff0c;每个 partition 对应于一个 log 文件&am…

大模型(Large Models):探索人工智能领域的新边界

&#x1f31f;文章目录 &#x1f31f;大模型的定义与特点&#x1f31f;模型架构&#x1f31f;大模型的训练策略&#x1f31f;大模型的优化方法&#x1f31f;大模型的应用案例 随着人工智能技术的飞速发展&#xff0c;大模型&#xff08;Large Models&#xff09;成为了引领深度…

CSS盒模型(详讲)

目录 概述&#xff1a; 内容区&#xff08;content&#xff09;&#xff1a; 内边距&#xff08;paddingj&#xff09;&#xff1a; 前言&#xff1a; 设置内边距&#xff1a; 边框&#xff08;border&#xff09;&#xff1a; 前言&#xff1a; 示例&#xff1a; 外边…

ACID模型是什么

ACID模型是什么 ACID模型是数据库管理系统中保证事务处理安全性的一组特性。ACID是原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consistency&#xff09;、隔离性&#xff08;Isolation&#xff09;和持久性&#xff08;Durability&#xff09;四个英文单词的…

WebApi+Python PyQ5实现大文件下载,Ui增加进度条和下载速率+已验证uos和Windows环境

Web Api接品代码&#xff1a; using Microsoft.AspNetCore.Mvc; using System.Collections.Concurrent; using System.Net;namespace LargeFileHandling.Controllers {[ApiController][Route("[controller]")]public class TestProgramFileManagerController : Cont…