linux下检测程序内存泄漏方法步骤

1.安装使用valgrind

sudo yum install valgrind

valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --verbose --log-file=valgrind-out.txt ./your_program

当我执行一个程序,库在子文件夹中时,需要先将子文件夹中的库文件路径指定为环境变量,然后再运行你的程序;

export LD_LIBRARY_PATH=$(pwd)/lib:$(pwd)/lib/postgres:$LD_LIBRARY_PATH

程序如果是服务,需要执行kill -15  id,命令去让程序正常退出后,才会记录内存泄漏情况;id是进程id可以通过ps -f | grep 进程名称 来获取,或者 pgrep  进程名称 来获取;程序退出后,才会出现泄漏日志

 2.valgrind日志分析

一般只要看 definitely lost的地方,在valgrind-out.txt中全局搜索definitely lost关键词,就会定位到内存泄漏的地方

(1)泄漏汇总

LEAK SUMMARY:
==260150== definitely lost: 383,348 bytes in 28 blocks //确定是内存泄漏的
==260150== indirectly lost: 1,137,920 bytes in 55,958 blocks//间接导致的内存泄漏
==260150== possibly lost: 647,588 bytes in 1,601 blocks
==260150== still reachable: 1,013,620 bytes in 10,373 blocks

(2)泄漏详情

直接搜索definitely lost 就会找到泄漏的堆栈信息,调用顺序是从下往上的,看最近的调用可以看最上面,最后找到泄漏是在authorize_server_get_safenet_info new的内存,没有释放调

==260150== 244,104 (264 direct, 243,840 indirect) bytes in 3 blocks are definitely lost in loss record 2,135 of 2,139
==260150== at 0x4C2C089: calloc (vg_replace_malloc.c:762)
==260150== by 0x55A18D1: mxml_new (mxml-node.c:751)
==260150== by 0x55A1496: mxmlNewElement (mxml-node.c:400)
==260150== by 0x559E09B: mxml_load_data (mxml-file.c:1771)
==260150== by 0x559BD37: mxmlLoadString (mxml-file.c:192)
==260150== by 0x4A5A23: authorize_server_get_safenet_info (authorise.cpp:2257)
==260150== by 0x57A814: __restful_getSafenetInfo(std::string&) (restful_authCMS.cpp:3521)
==260150== by 0x57C24A: __restful_get_allAuthInfo_ret(int, APPWEBS_T*) (restful_authCMS.cpp:3868)
==260150== by 0x582E98: restful_authCMS_getAllAuthResourceInfo (restful_authCMS.cpp:5772)
==260150== by 0x56F8BB: rest_srv_proc(APPWEBS_T*) (rest_root.cpp:542)
==260150== by 0x5488AA: runSelfCtrl (selfCtrlHandler.c:1298)
==260150== by 0x53B008: maRunPipeline (pipeline.c:340)
==260150==

3.自动根据进程名称获取进程内存使用并显示脚本getmemory.sh

#!/bin/bash

# 定义循环间隔时间(秒)
PROCESS_NAME="SystemCMS"
INTERVAL=4
lastuse=0;
while true; do
    # 获取进程ID
    PID=$(pgrep $PROCESS_NAME)
    
    if [ -z "$PID" ]; then
        echo "$PROCESS_NAME 进程未找到"
    else
        # 获取内存使用情况
        MEM_USAGE=$(cat /proc/$PID/status | grep VmRSS)
        echo "$PROCESS_NAME 进程ID: $PID"
        echo "内存使用情况: $MEM_USAGE"
    fi

    # 等待指定的间隔时间
    sleep $INTERVAL
done

 4.如果是web后台服务需要循环调用web网页

可以用ChromeReloadPlus插件,放入谷歌浏览器中,定时刷新网页调用web服务接口;来测试web服务是否存在内存泄漏

下载地址:

https://download.csdn.net/download/baochunlei1/90484400

下载之后解压,打开谷歌浏览器设置---扩展程序,将插件拖入网页,然后点击浏览器右上角的

 

点击插件选择时间,定时刷新网页;

posted @ 2025-03-18 11:18  一字千金  阅读(288)  评论(0)    收藏  举报