内存泄漏动态检测(valgrind)

news2024/11/19 10:39:12

初步判断是否有泄漏

Linux 内存性能优化 —— 高内存使用及内存泄漏排查
比如该文的介绍,需要初步了解top free -h等命令;
主要看free
在这里插入图片描述
在这里插入图片描述

内存泄漏检测方法:

静态我常用的是cppcheck;

动态的 Linux下内存泄漏定位方法

这个文章介绍的就不错
如:valgrind

按照该教程,大概复现了一下:

valgrind

比如下面这段代码;

1.需要添加头文件#include <mcheck.h>
2.怀疑泄漏的地方,两端成对使用
mtrace();
//怀疑出问题的代码
//int * hhh = new int; * hhh =1;  --加了一个new,未 delete
//pthread_join(ppid[i], 0);  --屏蔽了线程的资源阻塞回收
muntrace();
3.编译;
4.运行
valgrind --log-file='./log1' --leak-check=full --track-fds=yes ./test

前提你的系统支持valgrind,可用 valgrind --version查看是否支持
其中 选项有 输出日志目录;检测选项 ;运行程序等

// filename: test.c
#define _GNU_SOURCE
#include <unistd.h>  
#include <stdio.h>
#include <stdlib.h>
#include <sched.h>
#include <pthread.h>
#include <mcheck.h>
// 用来打印当前的线程信息:调度策略是什么?优先级是多少?
void get_thread_info(const int thread_index)
{
    int policy;
    struct sched_param param;

    printf("\n====> thread_index = %d \n", thread_index);

    pthread_getschedparam(pthread_self(), &policy, &param);
    if (SCHED_OTHER == policy)
        printf("thread_index %d: SCHED_OTHER \n", thread_index);
    else if (SCHED_FIFO == policy)
        printf("thread_index %d: SCHED_FIFO \n", thread_index);
    else if (SCHED_RR == policy)
        printf("thread_index %d: SCHED_RR \n", thread_index);

    printf("thread_index %d: priority = %d \n", thread_index, param.sched_priority);
}

// 线程函数,
void *thread_routine(void *args)
{

		
    // 参数是:线程索引号。四个线程,索引号从 1 到 4,打印信息中使用。
    int thread_index = *(int *)args;
    
    // 为了确保所有的线程都创建完毕,让线程睡眠1秒。
    sleep(1);

    // 打印一下线程相关信息:调度策略、优先级。
    get_thread_info(thread_index);

    long num = 0;
    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 5000000; j++)
        {
            // 没什么意义,纯粹是模拟 CPU 密集计算。
            float f1 = ((i+1) * 345.45) * 12.3 * 45.6 / 78.9 / ((j+1) * 4567.89);
            float f2 = (i+1) * 12.3 * 45.6 / 78.9 * (j+1);
            float f3 = f1 / f2;
            
        }usleep(1000);
        
        // 打印计数信息,为了能看到某个线程正在执行
        printf("thread_index %d: num = %ld \n", thread_index, num++);
    }
    
    // 线程执行结束
    printf("thread_index %d: exit \n", thread_index);
    return 0;
}

int main(void)
{mtrace();
    //int * hhh = new int; * hhh =1;
     
    // 一共创建四个线程:0和1-实时线程,2和3-普通线程(非实时)
    int thread_num = 4;
    
    // 分配的线程索引号,会传递给线程参数
    int index[4] = {1, 2, 3, 4};

    // 用来保存 4 个线程的 id 号
    pthread_t ppid[4];
    
    // 用来设置 2 个实时线程的属性:调度策略和优先级
    pthread_attr_t attr[2];
    struct sched_param param[2];

    // 实时线程,必须由 root 用户才能创建
    if (0 != getuid())
    {
        printf("Please run as root \n");
        //exit(0);
    }

    // 创建 4 个线程
    for (int i = 0; i < thread_num; i++)
    {
	 
				cpu_set_t mask;
		int cpus = sysconf(_SC_NPROCESSORS_CONF);
		CPU_ZERO(&mask);
		CPU_SET(0, &mask);
		if (pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask) < 0)
		{
			printf("set thread affinity failed! \n");
		}	
        if (i <= 1)    // 前2个创建实时线程
        {
            // 初始化线程属性
            pthread_attr_init(&attr[i]);
            
            // 设置调度策略为:SCHED_FIFO SCHED_RR
            int res = pthread_attr_setschedpolicy(&attr[i], SCHED_FIFO);
            if(res != 0) printf("i =1 or 2 \n");
            // 设置优先级为 51,52。
            param[i].__sched_priority = 51 + i;
            res = pthread_attr_setschedparam(&attr[i], &param[i]);
            if(res != 0) printf("i =1 or 2 \n");
            // 设置线程属性:不要继承 main 线程的调度策略和优先级。
            pthread_attr_setinheritsched(&attr[i], PTHREAD_EXPLICIT_SCHED);
            
            // 创建线程
            pthread_create(&ppid[i], &attr[i],thread_routine, (void *)&index[i]);
        }
        else        // 后两个创建普通线程
        {
            pthread_create(&ppid[i], 0, thread_routine, (void *)&index[i]);
        }
        
    }

//pthread_join(ppid[0], 0);
//pthread_join(ppid[1], 0);
//pthread_join(ppid[2], 0);
//pthread_join(ppid[3], 0);
    // 等待 4 个线程执行结束
    //for (int i = 0; i < 2; i++)
        //pthread_join(ppid[i], 0);

    for (int i = 0; i < 2; i++)
        //pthread_attr_destroy(&attr[i]);
    muntrace();
}

日志

hann@hann-virtual-machine:~/linux_app/pthread$ cat log1
==8015== Memcheck, a memory error detector
==8015== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==8015== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==8015== Command: ./test
==8015== Parent PID: 7229
==8015== 
==8015== 
==8015== FILE DESCRIPTORS: 4 open at exit.
==8015== Open file descriptor 3: /home/hann/linux_app/pthread/log1
==8015==    <inherited from parent>
==8015== 
==8015== Open file descriptor 2: /dev/pts/1
==8015==    <inherited from parent>
==8015== 
==8015== Open file descriptor 1: /dev/pts/1
==8015==    <inherited from parent>
==8015== 
==8015== Open file descriptor 0: /dev/pts/1
==8015==    <inherited from parent>
==8015== 
==8015== 
==8015== HEAP SUMMARY:
==8015==     in use at exit: 1,156 bytes in 5 blocks
==8015==   total heap usage: 10 allocs, 5 frees, 205,124 bytes allocated
==8015== 
==8015== 4 bytes in 1 blocks are definitely lost in loss record 1 of 3
==8015==    at 0x4C3217F: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==8015==    by 0x108EA3: main (in /home/hann/linux_app/pthread/test)
==8015== 
==8015== 576 bytes in 2 blocks are possibly lost in loss record 2 of 3
==8015==    at 0x4C33B25: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==8015==    by 0x4013646: allocate_dtv (dl-tls.c:286)
==8015==    by 0x4013646: _dl_allocate_tls (dl-tls.c:530)
==8015==    by 0x4E46227: allocate_stack (allocatestack.c:627)
==8015==    by 0x4E46227: pthread_create@@GLIBC_2.2.5 (pthread_create.c:644)
==8015==    by 0x109168: main (in /home/hann/linux_app/pthread/test)
==8015== 
==8015== 576 bytes in 2 blocks are possibly lost in loss record 3 of 3
==8015==    at 0x4C33B25: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==8015==    by 0x4013646: allocate_dtv (dl-tls.c:286)
==8015==    by 0x4013646: _dl_allocate_tls (dl-tls.c:530)
==8015==    by 0x4E46227: allocate_stack (allocatestack.c:627)
==8015==    by 0x4E46227: pthread_create@@GLIBC_2.2.5 (pthread_create.c:644)
==8015==    by 0x1091AF: main (in /home/hann/linux_app/pthread/test)
==8015== 
==8015== LEAK SUMMARY:
==8015==    definitely lost: 4 bytes in 1 blocks
==8015==    indirectly lost: 0 bytes in 0 blocks
==8015==      possibly lost: 1,152 bytes in 4 blocks
==8015==    still reachable: 0 bytes in 0 blocks
==8015==         suppressed: 0 bytes in 0 blocks
==8015== 
==8015== For counts of detected and suppressed errors, rerun with: -v
==8015== ERROR SUMMARY: 3 errors from 3 contexts (suppressed: 0 from 0)

其中有问题的点:
1.8015 4 bytes in 1 blocks are definitely lost in loss record 1 of 3
8015 at 0x4C3217F: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
8015 by 0x108EA3: main (in /home/hann/linux_app/pthread/test)

2.8015 by 0x4E46227: allocate_stack (allocatestack.c:627)
8015 by 0x4E46227: pthread_create@@GLIBC_2.2.5

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

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

相关文章

Node.js 一:基础

1.node.js是什么&#xff1a; 2.node.js的作用&#xff1a; 1.服务器应用&#xff1a;b站.. 2.开发工具类应用&#xff1a;webpack&#xff0c;bable等等 3.桌面端应用&#xff1a;vscode&#xff0c;postman等 这些应用都是基于electron框架开发&#xff0c;electron基于node…

【设计模式】23种设计模式之行为型模式

一、模板方法模式 1、豆浆制作问题 编写制作豆浆的程序&#xff0c;说明如下: 1&#xff09;、制作豆浆的流程 选材--->添加配料--->浸泡--->放到豆浆机打碎 2&#xff09;、通过添加不同的配料&#xff0c;可以制作出不同口味的豆浆 3&#xff09;、选材、浸泡和放…

拥抱还是革命,ChatGPT时代 AI专家给出15条科研生存之道

来源&#xff1a;专知 微信号&#xff1a;Quan_Zhuanzhi 你是学术机构的人工智能研究员吗?你是否担心自己无法应对当前人工智能的发展步伐?您是否觉得您没有(或非常有限)访问人工智能研究突破所需的计算和人力资源?你并不孤单; 我们有同样的感觉。越来越多的人工智能学者不…

vuepress-yarn-nodes-静态网页_个人博客搭建

nodes官网&#xff1a;https://nodejs.org/en 先下载nodes进行安装&#xff0c;一般nodes会自带包管理器npm&#xff0c;注意npm与nodes的对应关系&#xff0c;除了npm之外还有yarn包管理器&#xff0c;一般会用npm安装这个包 npm install --global yarnnpm降低版本的方法 np…

LeetCode 1026. 节点与其祖先之间的最大差值

【LetMeFly】1026.节点与其祖先之间的最大差值 力扣题目链接&#xff1a;https://leetcode.cn/problems/maximum-difference-between-node-and-ancestor/ 给定二叉树的根节点 root&#xff0c;找出存在于 不同 节点 A 和 B 之间的最大值 V&#xff0c;其中 V |A.val - B.val…

《花雕学AI》24:如何用万能Prompt公式与ChatGPT进行高效的对话测试

引言 你是否想要与人工智能进行有趣、有价值、有说服力的对话&#xff1f;你是否想要使用ChatGPT这个强大而灵活的对话生成器来创造出任何类型和主题的对话&#xff1f;如果是这样&#xff0c;那么你需要了解一个简单而强大的工具&#xff0c;就是万能Prompt公式。 万能Promp…

微软office认证课程

感谢阅读 非原创声明&#xff0c;根据微软课程学习理解而已Get started with Microsoft 365Work Smarter with Microsoft Word与 Microsoft Word 更加智能地工作Microsoft 365 SubscriptionsMicrosoft 365 订阅个人补充Exercise: Finding Help and changing account settings练…

cpp 程序与 c 程序的相互调用(extern “C“ 的使用)

实际在编译的过程中&#xff0c;.cpp 文件调用 .c文件中的函数会出错。假设代码结构如下&#xff1a; 目录 一、编译过程分析 1、预处理 2、编译 3、汇编 4、链接 二、问题解决 1、解决方案 2、解决思路 一、编译过程分析 1、预处理 该阶段头文件会被展开&#xff0c…

FPGA学习笔记(二):时序逻辑之计数器

与组合逻辑&#xff08;给定输入&#xff0c;输出是确定的&#xff0c;与时间无关&#xff09;相比较&#xff0c;时序逻辑不仅仅与输入信号相关&#xff0c;还与时钟信号相关。 D触发器&#xff1a;在上升沿时&#xff08;CLK&#xff09;才将输出&#xff08;Q&#xff09;修…

Failed to load property source from location ‘classpath:/application.yaml‘

问题 项目起动时&#xff0c;找不到yaml&#xff0c;各种处理还是没有解决&#xff0c;比如&#xff0c;clean&#xff0c;重启电脑&#xff0c;检查utf8等。 同事拉的新代码又是正常可以跑&#xff0c;这就有点奇怪了。 11:07:39.682 [main] ERROR org.springframework.boot.…

【19】linux进阶——后台运行()和nohup命令

大家好&#xff0c;这里是天亮之前ict&#xff0c;本人网络工程大三在读小学生&#xff0c;拥有锐捷的ie和红帽的ce认证。每天更新一个linux进阶的小知识&#xff0c;希望能提高自己的技术的同时&#xff0c;也可以帮助到大家 另外其它专栏请关注&#xff1a; 锐捷数通实验&…

分享自己接私活常用的开源系统

目前开源系统是JNPF框架。技术栈上是SpringBoot、SpringCloud、Spring Web、MyBatis、Swagger、Vue、Element。 这些都是比较主流的技术&#xff0c;无论是技术层面的先进性还是学习难度都是比较低的&#xff0c;目前网络上有大量可供参考学习的资料。 并且它支持前后端分离和…

Ceph入门到精通-Ceph如何扩展到超过十亿个对象?

Ceph如何扩展到超过十亿个对象&#xff1f;-ceph部署多少个节点 (51cto.com) 越来越多的组织被要求管理数十亿个文件和几百上千PB的数据。无论是在公共云还是本地环境中&#xff0c;Ceph对象存储都是值得考虑的一个选项。本篇文章将通过七部分的精选内容为下面这些问题提供答案…

vue3+echarts实现世界地图以及轨线(label使用fomatter+rich动态添加图片及背景色,以及label如何添加动态边框色)

背景 最近项目开发&#xff0c;需要开发一个世界地图&#xff0c;并且实现经纬度对应的点对点轨线动效&#xff0c;效果如下&#xff1a; 问题 如何在刚打开页面的时候就显示地点名称label如何同时添加图片和背景色label怎么动态修改字体颜色及图片以及动态边框色添加动效及…

YumRepo Error: All mirror URLs are not using ftp, http[s] or file解决办法

文章目录 一、问题背景二、问题原因三、解决方法 一、问题背景 CentOS6.5利用yum -y install gcc命令安装程序报错YumRepo Error: All mirror URLs are not using ftp, http[s] or file.Eg. Invalid release/repo/arch combination/ removing mirrorlist with no valid mirror…

maven安装教程(结合eclipse和IDEA)

一.安装maven 本文须知:安装maven环境之前要先安装java jdk环境(没有安装java环境的可以先去看安装JAVA环境的教程)Maven 3.3+ require JDK 1.7 及以上。 第一步:下载maven(本教程安装的是3.8.4) 官方下载链接:https://maven.apache.org/download.cgi Binary是可执行版本…

电子台账:生成的数据和图表导出到一个excel表中

目录 1 数据选择 1.1 选择1行数据 1.2 选择1列数据 2 图表设置 3 数据导出 为了便于进行数据分析和数据展示&#xff0c;可以把生成的汇总数据生成图表&#xff0c;然后对图表进行定制修改&#xff0c;最后把数据和图表一起导出到一个excel表中。 程序目前支持两种数据作…

【C++学习笔记】函数

值传递 值传递&#xff1a;函数调用时实参将数值传入给形参 做值传递时函数的形参发生改变&#xff0c;并不会影响实参 因为形参的作用域在函数内只有在调用函数时才会为其分配内存&#xff0c;函数调用结束后释放函数内的变量内存。 #include<iostream> using namespa…

mybatis04-mybatis缓存、分页插件、注解开发(一对一、多对一、多对多)

mybatis04 mybatis 缓存 一、mybatis 缓存概述 1、缓存 ​ 缓存 是存在于内存中的临时数据&#xff0c;使用缓存的目的是&#xff1a;减少和数据库的交互次数&#xff0c;提高执行效率。 2、mybatis 缓存 ​ mybatis 与 大多数的持久层框架一样&#xff0c;提供了缓存策略…

网络视频监控如何入门?如何安装和配置、设备选择和实时监控?

网络视频监控是一种先进的安全技术&#xff0c;它可以通过互联网连接到远程视频服务器&#xff0c;使用户可以随时随地监控所关注的地点。本文将介绍网络视频监控的基础入门知识&#xff0c;包括安装和配置、设备选择和实时监控等方面。 一、安装和配置 在进行网络视频监控前&…