前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >valgrind测试报告分析

valgrind测试报告分析

原创
作者头像
yzh
修改2020-08-17 14:32:56
2.8K0
修改2020-08-17 14:32:56
举报
文章被收录于专栏:YZh学习记录YZh学习记录

1. 内存泄漏测试

代码语言:javascript
复制
valgrind --log-file=test.log --leak-check=full --show-leak-kinds=all--track-origins=yes  ./demo

说明:

通过此命令可以同时测试 变量未初始化以及内存泄漏两个部分

2. 测试报告解读

2.1 变量未初始化部分

代码语言:javascript
复制
这里是变量未初始化的详细测试报告

==23591== Conditional jump or move depends on uninitialised value(s)
==23591==    at 0x67128BD6: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.440.100)
==23591==    by 0x6712D2ED: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.440.100)
==23591==    by 0x66FB0CB7: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.440.100)
==23591==    by 0x6712F96C: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.440.100)
==23591==    by 0x6712FBB9: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.440.100)
==23591==    by 0x66FB2A2F: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.440.100)
==23591==    by 0x66F7573C: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.440.100)
==23591==    by 0x66F75F31: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.440.100)
==23591==    by 0x67014F33: cuInit (in /usr/lib/x86_64-linux-gnu/libcuda.so.440.100)
==23591==    by 0x1F0F5BC3: ??? (in /home/xuanjingwei/Lib/TensorRT-7.1.3.4/targets/x86_64-linux-gnu/lib/libnvinfer.so.7.1.3)
==23591==    by 0x1F0F6B92: ??? (in /home/xuanjingwei/Lib/TensorRT-7.1.3.4/targets/x86_64-linux-gnu/lib/libnvinfer.so.7.1.3)
==23591==    by 0x2DB7E826: __pthread_once_slow (pthread_once.c:116)

==23591==  Uninitialised value was created by a stack allocation
==23591==    at 0x67128B6D: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.440.100)


#这里指明了未初始化的具体位置,位于libcuda.so.440.100  库文件
如果是.c/.cpp文件则会指出具体行号,这里是一个库文件。

因为--track-origins=yes 命令,才会出现后面两行的详细信息否则不会出现。

==23591== Use of uninitialised value of size 8
==23591==    at 0x67128BDA: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.440.100)
==23591==    by 0x6712D2ED: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.440.100)
==23591==    by 0x66FB0CB7: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.440.100)
==23591==    by 0x6712F96C: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.440.100)
==23591==    by 0x6712FBB9: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.440.100)
==23591==    by 0x66FB2A2F: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.440.100)
==23591==    by 0x66F7573C: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.440.100)
==23591==    by 0x66F75F31: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.440.100)
==23591==    by 0x67014F33: cuInit (in /usr/lib/x86_64-linux-gnu/libcuda.so.440.100)
==23591==    by 0x1F0F5BC3: ??? (in /home/xuanjingwei/Lib/TensorRT-7.1.3.4/targets/x86_64-linux-gnu/lib/libnvinfer.so.7.1.3)
==23591==    by 0x1F0F6B92: ??? (in /home/xuanjingwei/Lib/TensorRT-7.1.3.4/targets/x86_64-linux-gnu/lib/libnvinfer.so.7.1.3)
==23591==    by 0x2DB7E826: __pthread_once_slow (pthread_once.c:116)

==23591==  Uninitialised value was created by a stack allocation
==23591==    at 0x67128B6D: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.440.100)

2.2 内存泄漏部分

valgrind输出结果会报告5种内存泄露,"definitely lost", "indirectly lost", "possibly lost", "still reachable", and "suppressed"。这五种内存泄露分析如下:

"definitely lost":确认丢失。程序中存在内存泄露,应尽快修复。当程序结束时如果一块动态分配的内存没有被释放且通过程序内的指针变量均无法访问这块内存则会报这个错误。 

"indirectly lost":间接丢失。当使用了含有指针成员的类或结构时可能会报这个错误。这类错误无需直接修复,他们总是与"definitely lost"一起出现,只要修复"definitely lost"即可。

"possibly lost":可能丢失。大多数情况下应视为与"definitely lost"一样需要尽快修复,除非你的程序让一个指针指向一块动态分配的内存(但不是这块内存起始地址),然后通过运算得到这块内存起始地址,再释放它。当程序结束时如果一块动态分配的内存没有被释放且通过程序内的指针变量均无法访问这块内存的起始地址,但可以访问其中的某一部分数据,则会报这个错误。

"still reachable":可以访问,未丢失但也未释放。如果程序是正常结束的,那么它可能不会造成程序崩溃,但长时间运行有可能耗尽系统资源,因此笔者建议修复它。如果程序是崩溃(如访问非法的地址而崩溃)而非正常结束的,则应当暂时忽略它,先修复导致程序崩溃的错误,然后重新检测。

"suppressed":已被解决。出现了内存泄露但系统自动处理了。可以无视这类错误。这类错误我没能用例程触发,看官方的解释也不太清楚是操作系统处理的还是valgrind,也没有遇到过。所以无视他吧~

堆内存使用情况概述(HEAP SUMMARY)

代码语言:javascript
复制
==27565== HEAP SUMMARY:
==27565==     in use at exit: 410,972,014 bytes in 324,462 blocks
==27565==   total heap usage: 1,188,284 allocs, 863,822 frees, 2,949,133,011 bytes allocated

#表示: 申请内存的次数, 释放内存的次数,  被分配内存的总大小
代码语言:javascript
复制
#内存泄漏的类型为still reachable
==27565== 4 bytes in 1 blocks are still reachable in loss record 1 of 2,169
==27565==    at 0x4C2FDCB: malloc (vg_replace_malloc.c:299)
==27565==    by 0x67126369: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.440.100)
==27565==    by 0x6704F0BC: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.440.100)
==27565==    by 0x66EA2823: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.440.100)
==27565==    by 0x66EA2A97: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.440.100)
==27565==    by 0x66EA2E3F: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.440.100)
==27565==    by 0x66EA35D8: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.440.100)
==27565==    by 0x66F4E02D: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.440.100)
==27565==    by 0x66F50146: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.440.100)
==27565==    by 0x66E79818: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.440.100)
==27565==    by 0x6701637D: cuDevicePrimaryCtxRetain (in /usr/lib/x86_64-linux-gnu/libcuda.so.440.100)
==27565==    by 0x1EE3F74F: ??? (in /home/xuanjingwei/Lib/TensorRT-7.1.3.4/targets/x86_64-linux-gnu/lib/libnvinfer.so.7.1.3)

代码语言:javascript
复制
==27565== 545,040 bytes in 1,514 blocks are still reachable in loss record 2,143 of 2,169
==27565==    at 0x4C3201A: calloc (vg_replace_malloc.c:752)
==27565==    by 0x670C955B: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.440.100)
==27565==    by 0x670C9B47: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.440.100)
==27565==    by 0x66F6219A: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.440.100)
==27565==    by 0x66F5DF79: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.440.100)
==27565==    by 0x66F87423: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.440.100)
==27565==    by 0x66EBEE67: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.440.100)
==27565==    by 0x66EBF3FB: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.440.100)
==27565==    by 0x64D6D609: ??? (in /home/xuanjingwei/Lib/cuda/cuda-10.2/targets/x86_64-linux/lib/libcublasLt.so.10.2.2.89)
==27565==    by 0x64D6072F: ??? (in /home/xuanjingwei/Lib/cuda/cuda-10.2/targets/x86_64-linux/lib/libcublasLt.so.10.2.2.89)
==27565==    by 0x64D6C959: ??? (in /home/xuanjingwei/Lib/cuda/cuda-10.2/targets/x86_64-linux/lib/libcublasLt.so.10.2.2.89)
==27565==    by 0x64D7065E: ??? (in /home/xuanjingwei/Lib/cuda/cuda-10.2/targets/x86_64-linux/lib/libcublasLt.so.10.2.2.89)
#先告诉你出现了多少的内存泄露,然后从最里层不断往外部函数显示:这里全是问号,是因为找不到具体函数名称。

#先说是calloc造成的错误,然后不断往外部函数显示。
#一般可以从下往上进行查看。如下图所示:

泄露情况概述(LEAK SUMMARY)

代码语言:javascript
复制
==27565== LEAK SUMMARY:
==27565==    definitely lost: 0 bytes in 0 blocks
==27565==    indirectly lost: 0 bytes in 0 blocks
==27565==      possibly lost: 2,857,792 bytes in 21,141 blocks
==27565==    still reachable: 408,114,222 bytes in 303,321 blocks

#表示内存泄漏的大小

==27565==                       of which reachable via heuristic:
==27565==                         stdstring          : 8,760 bytes in 151 blocks
==27565==         suppressed: 0 bytes in 0 blocks

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 内存泄漏测试
  • 2. 测试报告解读
    • 2.1 变量未初始化部分
      • 2.2 内存泄漏部分
        • 堆内存使用情况概述(HEAP SUMMARY)
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档