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.mfbz.cn/a/549962.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大话设计模式之解释器模式

解释器模式是一种行为设计模式&#xff0c;它用于解释语言的语法或表达式&#xff0c;将其转换为可执行的程序或操作。这种模式通常用于处理类似编程语言或规则引擎中的问题。 在解释器模式中&#xff0c;通常有两种角色&#xff1a; 解释器&#xff08;Interpreter&#xff0…

Linux网络基础(一)

网络发展 对于我们国家来讲&#xff0c;网络的发展&#xff0c;不仅仅是互联网公司在发展&#xff0c;提供重要推动力的还有三大运商 随之而来的是新设备的诞生。比如集线器&#xff0c;网线&#xff0c;光纤&#xff0c;调制解调器&#xff0c;路由器&#xff0c;防火墙&am…

盲盒小程序成为收益“法宝”?盲盒线上如何发展

近年来&#xff0c;盲盒在年轻人中掀起了一股潮玩热风&#xff0c;受到了不少年轻人的青睐&#xff0c;盲盒商品更是在不断创新中&#xff0c;收藏价值逐渐提高。随着市场规模的扩大&#xff0c;越来越多的玩家和商家涌入到了市场中&#xff0c;盲盒的商业模式正在加快发展中。…

VBA脚本: excel隐藏和展开指定行 【图文】

打开开发工具功能 【文件】-》【选项】-》【自定义功能区】-》勾选【开发工具】-》【确定】 代开VBA编辑器 【开发工具】-》【Visual Basic】 插入模块 编写代码 所有sheet 关闭 Sub HideRowsInAllSheets()Dim ws As WorksheetDim i As Integer 循环遍历所有工作表For E…

使用Python进行自动化测试【第163篇—自动化测试】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 如何使用Python进行自动化测试&#xff1a;测试框架的选择与应用 自动化测试是软件开发过程…

ubuntu+安装Google Protobuf 库

本文参考文章如下 https://blog.csdn.net/wzw1609119742/article/details/119712422#t18https://blog.csdn.net/j8267643/article/details/134133091https://blog.csdn.net/jax_fanyang/article/details/135937002?spm1001.2014.3001.5502 现在论坛上据大部分的教程都是下面…

java正则表达式教程

什么是正则表达式&#xff1a; 正则表达式是一种用来描述字符串模式的语法。在 Java 中&#xff0c;正则表达式通常是一个字符串&#xff0c;它由普通字符&#xff08;例如字母、数字、标点符号等&#xff09;和特殊字符&#xff08;称为元字符&#xff09;组成。这些特殊字符可…

ubuntu22安装宝塔面板

方法一&#xff1a;运行安装宝塔命令 wget -O install.sh https://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh ed8484bec 安装成功后&#xff0c;需到服务器管理后台的安全组中配置新规则&#xff0c;放行宝塔面板的端口&#xff08;以阿…

springboot整合dubbo实现RPC服务远程调用

一、dubbo简介 1.什么是dubbo Apache Dubbo是一款微服务开发框架&#xff0c;他提供了RPC通信与微服务治理两大关键能力。有着远程发现与通信的能力&#xff0c;可以实现服务注册、负载均衡、流量调度等服务治理诉求。 2.dubbo基本工作原理 Contaniner:容器Provider&#xf…

Flink CDC在阿里云DataWorks数据集成应用实践

摘要&#xff1a;本文整理自阿里云 DataWorks 数据集成团队的高级技术专家 王明亚&#xff08;云时&#xff09;老师在 Flink Forward Asia 2023 中数据集成专场的分享。内容主要为以下四部分&#xff1a; 阿里云 DataWorks 数据集成介绍基于 Flink CDC 数据集成新版引擎架构和…

数字革命的先锋:Web3对社会的影响

引言 在信息技术飞速发展的当下&#xff0c;Web3作为一个新兴的互联网模式&#xff0c;正在逐渐改变我们的生活方式、商业模式和社会结构。本文将深入探讨Web3的核心特点、它在各个领域中的应用以及对社会产生的深远影响。 1. Web3的核心特点 1.1 去中心化 Web3强调去中心化…

03.卸载MySQL

卸载MySQL 1.Windows卸载MySQL8 停止服务 用命令停止或者在服务中停止都可以 net stop mysql&#xff08;服务名字可以去服务里面看一下&#xff09;控制面板卸载MySQL 卸载MySQL8.0的程序可以和其他桌面应用程序一样直接在控制面板选择卸载程序&#xff0c;并在程序列表中…

Excel高效办公:人力资源管理(AI版)

AI人力资源管理一本通&#xff1a;147个“温馨提示”53个“教您一招”&#xff0c;掌握使用Excel高效完成人力资源管理工作的“心法”&#xff0c;助你早做完、不加班。 一本书掌握人力资源高效管理的“心法”&#xff01; 案例丰富&#xff0c;参考性强&#xff1a;本书不是…

AR、VR、MR 和 XR——它们的含义以及它们将如何改变生活

我们的工作、娱乐和社交方式正在发生巨大变化。远程工作的人比以往任何时候都多,屏幕已成为学习和游戏的领先平台。这种演变为元宇宙铺平了道路——如今,像 Meta Quest 2 这样的流行设备将您无缝地带入一个身临其境的世界,您可以在其中购物、创作和玩游戏、与同事协作、探索…

ChatGPT深度科研应用、数据分析及机器学习、AI绘图与高效论文撰写教程

原文链接&#xff1a;ChatGPT深度科研应用、数据分析及机器学习、AI绘图与高效论文撰写https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247601506&idx2&sn5dae3fdc3e188e81b8a6142c5ab8c994&chksmfa820c85cdf58593356482880998fc6eb98e6889b261bf621e1d…

win10 鼠标箭头自己乱动解决方案

我这里只说我碰到的然后我的解决方案&#xff0c;不一定对其他问题有效&#xff1b; 1. 首先拔掉鼠标线查看鼠标箭头是否仍然在乱动&#xff0c;如果是则非鼠标问题&#xff0c;如果不再乱动则是鼠标的问题&#xff1b;验证非鼠标问题&#xff1b; 2. 因为鼠标乱动跟鼠标无关…

Django中的实时通信:WebSockets与异步视图的结合【第167篇—实时通信】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在现代Web应用程序中&#xff0c;实时通信已经成为了必不可少的功能之一。无论是在线聊天、…

AppBuilder升级!工作流编排正式上线!AssistantsAPI开放邀测!

>>【v0.5.3版本】 上线时间&#xff1a;2024/4/14 关键发版信息&#xff1a; 低代码态&#xff1a;新增工作流&#xff0c;低代码制作组件 自定义组件&#xff1a;支持用户自定义创建组件&#xff0c;并被Agent自动编排调用
 工作流框架&#xff1a;组件支持流式编排…

OpenCV轻松入门(八)——图片卷积

对图像和滤波矩阵进行逐个元素相乘再求和的操作就相当于将一个二维的函数移动到另一个二维函数的所有位置&#xff0c;这个操作就叫卷积。 卷积需要4个嵌套循环&#xff0c;所以它并不快&#xff0c;除非我们使用很小的卷积核。这里一般使用3x3或者5x5 图像滤波 图像滤波是尽…