树莓派中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
相关产品推荐
相关产品推荐

