专栏首页YZh学习记录valgrind测试报告分析
原创

valgrind测试报告分析

1. 内存泄漏测试

valgrind --log-file=test.log --leak-check=full --show-leak-kinds=all--track-origins=yes  ./demo

说明:

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

2. 测试报告解读

2.1 变量未初始化部分

这里是变量未初始化的详细测试报告

==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)

==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

#表示: 申请内存的次数, 释放内存的次数,  被分配内存的总大小
#内存泄漏的类型为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)

==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)

==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

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 深度学习trick--labelsmooth

    Label smoothing其全称是 Label Smoothing Regularization(LSR),即标签平滑正则化。

    yzh
  • 静态库与动态库的那些事

    完成宏替换、文件引入、以及去除空行、注释等,为下一步的编译做准备。也就是对各种预处理命令进行处理,包括文件的包含、宏定义的扩展、条件编译的选择等。

    yzh
  • Resnet 分享之问题汇总

    10. 池化与strid= 2 的比较,区别。为什么用stride = 2 代替 池化

    yzh
  • 数据库对象信息记录表|全方位认识 mysql 系统库

    在上一期《访问权限控制系统|全方位认识 mysql 系统库》中,我们结合MySQL的权限表详细介绍了MySQL 的访问权限控制系统,本期我们将为大家带来系列第三...

    老叶茶馆
  • 快速上手ndk开发! Mac/Win下配置和使用!(2018.4重编版)

    sean_yang
  • Spring Cloud构建微服务架构:服务注册与发现(Eureka、Consul)【Dalston版】

    前言 已经有非常长的时间没有更新《Spring Cloud构建微服务架构》系列文章了,自从开始写Spring Cloud的专题内容开始就获得了不少的阅读量和认可...

    程序猿DD
  • CPU profiler(gperftools)在嵌入式系统上的应用示例

    版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net...

    用户1148648
  • 【AI 引擎】Windows 10的机器学习能力 | 30年内,长生不老成真? | 群通信机器人方向实现突破

    1.Windows 10的Windows Defender机器学习能力 ? 今天微软club网站上公布了Windows 10系统Windows Defender...

    新智元
  • lanmp一键安装包出现NGINX 502 Bad Gateway错误的解决办法

    在搞定了数据库、中文乱码问题之后,网站是可以访问,也可以登录后台了。 不过问题又来了,发现后台的更新页面、插件页面又出错了。 提示:NGINX 502 Bad ...

    速企云
  • 从生产到交易,一文读懂比钻石还贵的“比特币”

    以物易物的比特村 话说在这个世界上,有一个叫比特村的小村庄,村庄共有几百户人家。这个村庄几乎与世隔绝,过着自给自足的生活。由于没有大规模贸易,比特村村民一直过着...

    BestSDK

扫码关注云+社区

领取腾讯云代金券