You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派中Valgrind无法检测多线程C++程序内存泄漏,求有效命令

树莓派下含pthread的C++程序内存泄漏检测问题

在树莓派上部署了一段使用pthread的C++程序,代码中存在多处未释放的malloc/new内存泄漏,但尝试多个Valgrind命令均无法检测到泄漏。保留pthread相关代码编译运行时,Valgrind不输出堆、泄漏及错误摘要;移除线程相关代码后则正常输出。现寻求能检测该程序内存泄漏的正确Valgrind命令。

程序代码

#include <iostream>
#include <thread>
#include <stdlib.h>
void *liveDataPush(void *);
using namespace std;
int main(void)
{
    pthread_t liveDataPushThread;
    int  RetThrd;
    void *ptr;
    RetThrd=pthread_create(&liveDataPushThread,NULL,liveDataPush, ptr);
    if (RetThrd != 0)
    {
        cout << "RetThrd" << endl;
    }
    for (int i = 0; i < 10000; i++)
    {
        int *j = (int *)(malloc(1024 * sizeof(int)));
        cout << "Hi" << endl;
        //free(j);
    }
    pthread_join(liveDataPushThread, NULL);
    return 0;
}
void *liveDataPush(void *)
{
    int *i = new int;
    *i = 30;
    //delete i;
    for (int i = 0; i < 10000; i++)
    {
        int *j = new int[1024];
        cout << "Hello" << endl;
        //delete[] j;
    }
    return NULL;
}

已尝试的命令

编译命令

gcc  -Wall -pedantic -g valgrind.cpp -o vlgrnd -pthread -lstdc++ 

Valgrind命令

valgrind --leak-check=yes ./vlgrnd
valgrind --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=20 --track-fds=yes ./vlgrnd
valgrind --tool=memcheck --vgdb=yes --vgdb-error=0 --leak-check=full ./vlgrnd

配合GDB的操作

gdb ./vlgrnd
target remote | vgdb

monitor leak_check full reachable any

正确的检测命令及说明

优化编译命令

优先使用g++编译C++代码(默认链接libstdc++,无需手动指定):

g++ -Wall -pedantic -g valgrind.cpp -o vlgrnd -pthread

有效Valgrind命令

valgrind --tool=memcheck --leak-check=full --show-leak-kinds=all --trace-children=yes ./vlgrnd

参数说明:

  • --trace-children=yes:强制Valgrind追踪所有由主线程创建的子线程,确保子线程中的内存分配/释放操作被监控(这是解决线程场景下不输出泄漏信息的关键)。
  • --leak-check=full:执行完整的泄漏检查,比--leak-check=yes更细致。
  • --show-leak-kinds=all:显示所有类型的内存泄漏(包括"仍可达"和"完全丢失"的泄漏),避免遗漏。

如果上述命令仍有问题,可尝试添加--fair-sched=yes参数,确保Valgrind能公平调度线程,避免因线程调度问题导致监控遗漏:

valgrind --tool=memcheck --leak-check=full --show-leak-kinds=all --trace-children=yes --fair-sched=yes ./vlgrnd

内容的提问来源于stack exchange,提问作者Madhusudhana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 09:33:21