5_vscode+valgrind+gdb调试程序

需求

  1. 项目程序, 读取串口数据, 出现程序崩溃问题
  2. valgrind 可以调试定位内存问题: 内存泄漏,非法地址访问,越界访问等内存问题
  3. vscode + gdb 可视化调试效果, 比命令行简单快捷很多
  4. 期望使用vscode + valgrind + gdb 调试程序内存异常, 崩溃退出的问题

环境准备
sudo apt install valgrind gdb

调试

1.valgrind + gdb 命令行调试程序

1.代码

51_mem_valgrind调试_内存泄漏_非法地址访问_越界.c

#include <stdio.h>
#include <string.h>
#include <stdint.h>// 1.内存泄漏
void memory_leak(void)
{char *p = (char *)malloc(1024);memset(p, 0, 1024);
}// 2.非法地址访问
void invalid_address_access(void)
{// uint8_t *p = 0x12345678;uint8_t *p = NULL;uint8_t val = *p;printf("val = %d\n", val);
}// 3.栈空间越界 读写
void corss_border_read_write(void)
{uint32_t a = 0x10;uint32_t *p = &a + 0x8;// 越界读 -- 导致逻辑错误printf("Invalid address read %x\n", *p);// 越界写 -- 程序错误*p = 0x12345678;printf("Invalid address write %x\n", *p);
}// 4.堆空间越界访问, 属于2.非法地址访问int main()
{memory_leak();corss_border_read_write();invalid_address_access();return 0;
}
2.编译

scons编译
SConstruct

env = Environment()
env["PROGSUFFIX"] = ".out"            # 可执行后缀.out
env["CCFLAGS"] = " -g3 -O0 -Wall"  # gdb 调试开关
env.Program("51_mem_valgrind调试_内存泄漏_非法地址访问_越界.c")

scons

g++ -o 51_mem_valgrind调试_内存泄漏_非法地址访问_越界.o -c -g3 -O0 --std=c99 51_mem_valgrind调试_内存泄漏_非法地址访问_越界.c
g++ -o 51_mem_valgrind调试_内存泄漏_非法地址访问_越界.out 51_mem_valgrind调试_内存泄漏_非法地址访问_越界.o

3.valgrind开启vgdb调试

valgrind --leak-check=full --show-leak-kinds=all --vgdb=yes --vgdb-error=0 51_mem_valgrind调试_内存泄漏_非法地址访问_越界.out

3279 Memcheck, a memory error detector
3279 Copyright © 2002-2017, and GNU GPL’d, by Julian Seward et al.
3279 Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info
3279 Command: ./51_mem_valgrind_____________________________________________.out
3279
3279 (action at startup) vgdb me …
3279
3279 TO DEBUG THIS PROCESS USING GDB: start GDB like this
3279 /path/to/gdb ./51_mem_valgrind调试_内存泄漏_非法地址访问_越界.out
3279 and then give GDB the following command
3279 target remote | /usr/lib/x86_64-linux-gnu/valgrind/…/…/bin/vgdb --pid=3279
3279 --pid is optional if only one valgrind process is running

valgrind 参数说明:

  • –leak-check=full 内存泄漏检测
  • –show-leak-kinds=all 详细各种异常检测
  • –vgdb=yes --vgdb-error=0 开启vgdb
4.gdb 调试

gdb 51_mem_valgrind调试_内存泄漏_非法地址访问_越界.out

Reading symbols from ./51_mem_valgrind调试_内存泄漏_非法地址访问_越界.out…
(gdb) target remote|vgdb #远程到vgdb调试
Remote debugging using |vgdb
relaying data between gdb and process 3279
Reading symbols from /usr/lib/debug/.build-id/7a/e2aaae1a0e5b262df913ee0885582d2e327982.debug…
0x0000000004001100 in _start () from /lib64/ld-linux-x86-64.so.2
c 按c开始运行

命令行效果如图:
![[valgrind+gdb调试程序.jpg]]

2.vscode + valgrind + gdb调试

1.vscode launch.json配置

使用国内几个大模型, 都无法给出正确可用的配置
在外网github搜到一个可参考的配置方法
链接: https://github.com/microsoft/vscode-cpptools/issues/4531
william-r-dieter commented on Aug 28, 2020
Here is the launch.json that worked for me:
launch.json

           "customLaunchSetupCommands" : [{"description": "Attach to valgrind","text": "target remote | /usr/lib64/valgrind/../../bin/vgdb","ignoreFailures": false  }],

vscode开启valgrind调试核心配置 launch.json

            "setupCommands": [{"description": "vgdb","text": "target remote | /usr/bin/vgdb ","ignoreFailures": true}],

launch.json 完整配置
注意不能照抄, 我的默认编译构建工具是scons

{"version": "0.2.0","configurations": [{"name": "(gdb) 启动","type": "cppdbg","request": "launch","program": "${fileDirname}/${fileBasenameNoExtension}.out","args": [],"stopAtEntry": false,"cwd": "${fileDirname}","environment": [],"externalConsole": false,"MIMode": "gdb","setupCommands": [{"description": "为 gdb 启用整齐打印","text": "-enable-pretty-printing","ignoreFailures": true},{"description": "vgdb","text": "target remote | /usr/bin/vgdb ","ignoreFailures": true}],"preLaunchTask": "scons"}]
}

2.valgrind 开启vgdb调试

valgrind --leak-check=full --show-leak-kinds=all --vgdb=yes --vgdb-error=0 51_mem_valgrind调试_内存泄漏_非法地址访问_越界.out

3.vscode 启动gdb远程

参考 1.vscode launch.json配置
F5 运行

效果如图
![[vscode+valgrind+gdb调试程序.jpg]]

总结

  1. valgrind + gdb 可以快速定位问题点
  2. 有概率gdb调试退出时, valgrind没有退出, 可以使用kill -9 强制退出 kill -9 valgrind_pid
  3. 项目中使用cppcheck + valgrind, 找出潜在的问题1个问题点
    1. 字节缓冲区, data_len变量为异常值(默认128, 异常时为156023), 导致指针索引地址越界
  • 当通过C 指针索引地址时, 如果索引为异常值, 导致越界,或非法访问, 确实有风险.
  • python列表,索引值越界会报异常
  • c++ vector<uint8_t> 索引值越界会报异常

反思

  1. c++中尽量将 bytes字节数据 转为vector<uint8_t> 处理
  2. 提交代码之前,进入安全自测: valgrind, lsof, ss 排查内存,文件句柄,套接字资源是否有泄漏,漏洞.
  3. 尝试使用安全的语言, 如rust, 确认是否会有此问题

我是一名 嵌入式-系统-网络-机器人爱好者


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

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

相关文章

(GPT-PLUS,RawChat,choose-car,Kimi,智谱清言)分享5个好用的ChatGPT

目录 1、GPT-PLUS拼车 2、RawChat公益站点 3、GPT-PLUS共享 4、choose-car 5、AI提示器 6、Kimi.ai - 帮你看更大的世界 7、智谱清言 1、GPT-PLUS拼车 https://home.topai.vip/list GPT-PLUS拼车 TOPAI宇宙 | Link3 2、RawChat公益站点 https://sharedchat.cn/ 3、GPT-PLUS共享…

书生浦语学习第二课 轻松玩转书生浦语趣味Demo

本节课让同学们实践 4 个内容&#xff0c;分别是&#xff1a;部署 InternLM2-Chat-1.8B 模型进行智能对话、部署一期实战营优秀作品 八戒-Chat-1.8B 模型、 运行 Lagent 智能体 Demo、实践部署 浦语灵笔2 模型。 第一步&#xff0c;打开 Intern Studio 界面&#xff0c;点击 创…

GDPU Java 天码行空8

文章目录 &#xff08;一&#xff09;实验目的&#xff08;二&#xff09;实验内容和步骤1、LinkedList 实现队列&#x1f496; MyQueueDemo.java&#x1f496; 运行结果&#xff1a; 2、集合的嵌套遍历&#x1f496; StudentDemo.java&#x1f496; 运行结果&#xff1a; 3、类…

清明三天,用Python赚了4万?

每年4月&#xff0c;是Python圈子里接私活的旺季&#xff0c;特别是在节假日这种数据暴增的时间段&#xff0c;爬虫采集、逆向破解类的私活订单会集中爆发&#xff0c;量大价高。几乎所有的圈内人都在趁着旺季接私活。 正好&#xff0c;我昨天就做了一单爬虫逆向私活&#xff…

MedSAM环境搭建推理测试

引子 之前分享过一篇SAM&#xff08;感兴趣的&#xff0c;请移步Segment Anything&#xff08;SAM&#xff09;环境安装&代码调试_segment anything环境-CSDN博客&#xff09;环境搭建&推理测试&#xff0c;虽然话说Segment Anything&#xff0c;但是原始模型对于一些…

OCCT几何内核开发-TopoDS_Shape

如果要基于OCCT几何内核搞建模算法&#xff0c;特别是想开发自己的算法&#xff0c;需要深刻理解拓扑与几何的关系、相关的数据结构&#xff0c;TopoDS_Shape、TopoDS_TShape、BRep_TFace、Tolerances等。 一个简单Box的数据结构 两个面缝合&#xff08;Sewing&#xff09;后的…

4.配置USART串口实现printf打印

通过TTL转USB实现电脑和单片机连通,是我们调试必不可少的工具 查看原理图,使用USART1,它们的TX和RX分别在PA9和PA10 新建Usart.c存放串口模块的初始化 这段代码是复制了正点原子的工程,添加到前面 #if SYSTEM_SUPPORT_OS #include "includes.h" //ucos 使用 …

JS算法题:找到数组中第 k 大的元素

问题描述&#xff1a; 给定一个未排序的整数数组&#xff0c;找到其中第 k 大的元素。注意&#xff0c;你可以假设 k 总是有效的&#xff0c;且 1 ≤ k ≤ 数组的长度。 举个例子&#xff1a; 如果给定数组是 [3,2,1,5,6,4]&#xff0c;k 是 2&#xff0c;那么第 2 大的元素…

深入理解神经网络学习率(定义、影响因素、常见调参方法、关键代码实现)

目录 什么是学习率&#xff1f; 有哪些影响因素&#xff1f; 常用调整方法&#xff1f; 博主介绍&#xff1a;✌专注于前后端、机器学习、人工智能应用领域开发的优质创作者、秉着互联网精神开源贡献精神&#xff0c;答疑解惑、坚持优质作品共享。本人是掘金/腾讯云/阿里云等平…

PyQt介绍——弹框介绍和使用

PyQt介绍——弹框介绍和使用 一、QMessageBox QMessageBox是一种通用的弹出式对话框&#xff0c;用于显示消息&#xff0c;允许用户通过单击不同的标准按钮对消息进行反馈 QMessageBox类提供了许多常用的弹出式对话框&#xff0c;如提示、警告、错误、询问、关于等对话框。这…

一文详解MES、ERP、SCM、WMS、APS、SCADA、PLM、QMS、CRM、EAM及其关系

经常遇到很多系统&#xff0c;比如&#xff1a;MES、ERP、SCM、WMS、APS、SCADA、PLM、QMS、CRM、EAM&#xff0c;这些都是什么系统&#xff1f;有什么功能和作用&#xff1f;它们之间的关系是怎样的&#xff1f; 今天就一文详细分享给大家。 10大系统之间的关系 ERP 和其他…

说说你对集合的理解?常见的操作有哪些?

一、是什么 集合&#xff08;Set&#xff09;&#xff0c;指具有某种特定性质的事物的总体&#xff0c;里面的每一项内容称作元素 在数学中&#xff0c;我们经常会遇到集合的概念&#xff1a; 有限集合&#xff1a;例如一个班集所有的同学构成的集合无限集合&#xff1a;例如…