valgrind可以用来检查内存泄露问题,检查日志会将可能出现的内存泄露告诉开发者,具体到了哪行代码中,开发者可以利用日志方便的找到自己程序中的内存泄漏问题。
1.安装
sudo pacman -S valgrind #for manjaro
sudo apt-get install valgrind #for ubuntu
2.检测内存泄漏
终端进入可执行文件所在的文件夹,输入
valgrind --tool=memcheck --leak-check=full --show-leak-kinds=all --undef-value-errors=no --log-file=log ./a.out #其中a.out是可执行程序名
即可在终端所在文件夹下生成log文件,如图
1 ==17030== Memcheck, a memory error detector
2 ==17030== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
3 ==17030== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info
4 ==17030== Command: ./BPlusTree
5 ==17030== Parent PID: 12330
6 ==17030==
7 ==17030==
8 ==17030== HEAP SUMMARY:
9 ==17030== in use at exit: 0 bytes in 0 blocks
10 ==17030== total heap usage: 45,181 allocs, 45,181 frees, 7,423,168 bytes a
11 ==17030==
12 ==17030== All heap blocks were freed -- no leaks are possible
13 ==17030==
14 ==17030== For counts of detected and suppressed errors, rerun with: -v
15 ==17030== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
在log文件最后会有个summary,其中对内存泄露进行了分类,总共有五类:
- (1) “definitely lost” 意味着你的程序一定存在内存泄露;
- (2)”indirectly lost”意味着你的程序一定存在内存泄露,并且泄露情况和指针结构相关
- (3) “possibly lost” 意味着你的程序一定存在内存泄露,除非你是故意进行着不符合常规的操作,例如将指针指向某个已分配内存块的中间位置。
- (4) “still reachable” 意味着你的程序可能是没问题的,但确实没有释放掉一些本可以释放的内存。这种情况是很常见的,并且通常基于合理的理由。
- (5)”suppressed” 意味着有些泄露信息被压制了。在默认的 suppression 文件中可以看到一些 suppression 相关设置。
其中,如果二叉树的根节点被判定为”definitely lost”,则其所有子节点将被判定为”indirectly lost”,而如果你正确修复了类型为 “definitely lost” 的根节点泄露,那么类型为 “indirectly lost” 的子节点泄露也会随着消失。
对于如上图所示的情况,posslbly lost其实并没有造成内存上的影响,如果想要过滤掉该类报告信息,可以加入–show-possibly-lost=no ,而对于”still reachable” ,同样可以通过–show-reachable=yes来控制是否输出相应的信息。
3.查看内存泄露位置
在log中由summary往上翻即可看到对应的错误,错误是不断细化的。根据函数调用栈可以清楚的看到哪里出现了内存泄漏。
valgrind是一款用于检查内存泄漏的工具,它能帮助开发者通过生成的log文件定位到具体的代码行,log文件中的summary会列出五类内存泄漏情况。包括definitely lost, indirectly lost, possibly lost, still reachable和suppressed。通过调整参数,可以控制哪些信息显示,从而更准确地找到和修复内存泄漏问题。"
118626666,10742440,Java实现DBScan聚类算法,"['数据挖掘', '算法实现', 'Java编程', '地理空间分析', '数据库']

717

被折叠的 条评论
为什么被折叠?



