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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】阿里云ECS搭建lnmp和lamp集群

搭建LNMP&#xff08;Linux Nginx MySQL PHP&#xff09;或LAMP&#xff08;Linux Apache MySQL PHP&#xff09;集群 创建ECS实例&#xff1a; 在阿里云控制台创建多个ECS实例&#xff0c;选择相应的操作系统和配置&#xff0c;确保这些实例在同一VPC网络内&#xff0c;…

系统架构最佳实践 -- 金融企业的资损问题介绍

什么是资损 资损通常来讲是指支付场景下的资金损失&#xff0c;这里可以从两个维度看 用户角度&#xff1a;多扣用户款导致用户资金损失&#xff0c;此问题一般需要通过客服等渠道反馈&#xff0c;可以把多的钱退给用户&#xff0c;但是很大程度上损失了用户体验&#xff1b; …

ssh爆破服务器的ip-疑似肉鸡

最近发现自己的ssh一直有一些人企图使用ssh暴力破解的方式进行密码破解.就查看了一下,真是网络安全太可怕了. 大家自己的服务器密码还是要设置好,管好,做好最基本的安全措施,不然最后只能沦为肉鸡. ssh登陆日志可以在/var/log下看到,ubuntu的话为auth.log,centos为secure文件 查…

【算法】回溯:与递归,dfs的同质与分别,剪枝与恢复现场的详细理解,n皇后的回溯解法及算法复杂度分析。

目录 ​编辑 1.什么是回溯 2.关于剪枝 3.关于恢复现场 4.题目&#xff1a;二叉树的所有路径&#xff08;凸显恢复现场&#xff1a;切实感受回溯与深搜&#xff09; 问题分析 ①函数设置为&#xff1a;void Dfs(root) ②函数设置为&#xff1a;void Dfs(root,path) 解题思想&…

微信小程序 发送消息 Token校验失败,请检查确认

如上图&#xff0c;文档中说的是 开发者通过检验 signature 对请求进行校验&#xff08;下面有校验方式&#xff09;。若确认此次 GET 请求来自微信服务器&#xff0c;请原样返回 echostr 参数内容&#xff0c;则接入生效&#xff0c;成为开发者成功&#xff0c;否则接入失败。…

深度学习图像处理基础工具——opencv 实战信用卡数字识别

任务 信用卡数字识别 穿插之前学的知识点 形态学操作 模板匹配 等 总体流程与方法 1.有一个模板 2 用轮廓检测把模板中数字拿出来 外接矩形&#xff08;模板和输入图像的大小要一致 &#xff09;3 一系列预处理操作 问题的解决思路 1.分析准备&#xff1a;准备模板&#…

[管理者与领导者-163] :团队管理 - 高效执行力 -1- 高效沟通的架构、关键问题、注意事项

目录 前言&#xff1a;沟通是管理者实施管理最重要的工作 一、人与人沟通模型 1.1 模型 1.2 完整过程 1.3 发送和接受方式 1.4 传输 1.5 关于编码与解码 1.6 反馈 1.7 沟通中常见问题 二、管理者如何提高沟通的效率 2.1 为什么管理者布置任务后&#xff0c;总有人…

数据仓库—维度建模—维度表设计

维度表 维度表(Dimension Table)是数据仓库中描述业务过程中各种维度信息的表,用于提供上下文和描述性信息,以丰富事实数据的分析 维度表是维度建模的灵魂所在,在维度表设计中碰到的问题(比如维度变化、维度层次、维度一致性、维度整合和拆分等)都会直接关系到维度建模…

pyqt和opencv结合01:读取图像、显示

在这里插入图片描述 1 、opencv读取图像用于pyqt显示 # image cv2.imread(file_path)image cv2.cvtColor(image, cv2.COLOR_BGR2RGB)# 将图像转换为 Qt 可接受的格式height, width, channel image.shapebytes_per_line 3 * widthq_image QImage(image.data, width, hei…

OLTP 与 OLAP 系统说明对比和大数据经典架构 Lambda 和 Kappa 说明对比——解读大数据架构(五)

文章目录 前言OLTP 和 OLAPSMP 和 MPPlambda 架构Kappa 架构 前言 本文我们将研究不同类型的大数据架构设计&#xff0c;将讨论 OLTP 和 OLAP 的系统设计&#xff0c;以及有效处理数据的策略包括 SMP 和 MPP 等概念。然后我们将了解经典的 Lambda 架构和 Kappa 架构。 OLTP …

【脚本】多功能Ubuntu临时授予用户sudo权限管理工具

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 设计原理和初衷可以看这里&#xff1a;【技巧】Ubuntu临时授予用户sudo权限&#xff0c;并在一定时间后自动撤销_ubuntu jianshao sudo-CSDN博客文章浏览阅读404次。非常实用_ubuntu jianshao sudohttps://blog.c…

【微信小程序——开发DAY4(黑马程序员课程)】

学习目标 自定义小程序组件自定义组件&#xff08;1.&#xff09;创建自定义组件文件夹&#xff08;2.&#xff09;引用自定义组件&#xff08;3.&#xff09;组件和页面的区别&#xff08;4.&#xff09;自定义组件的隔离性——自定义组件不影响小程序的样式——自定义组件也只…