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
- Git 项目推荐 | 开源 PHP 加密运行扩展
- Git 项目推荐 | 基于 J2Cache 的多级缓存框架
- 如何将生产环境的字段类型从INT修改为BIGINT
- 如何高效的使用PowerShell备份数据库
- Git 项目推荐 | Java 版按键精灵
- Elasticsearch-精确查找
- Git 项目推荐 | 图片验证码生成库
- Elasticsearch-深入理解索引原理
- Git 项目推荐 | html5 异步批量上传插件
- 老司机带你过常规WAF
- Git 项目推荐 | javascript ajax 代理调用工具
- Hive 时间日期处理总结
- 孤立的SQL用户
- 如何卸载CDH(附一键卸载github源码)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android实现向本地写入一个XML文件和解析XML文件
- Android自定义View实现带4圆角或者2圆角的效果
- Android 在 res/layout 文件夹 下创建一个 子文件夹实例
- Android开发实现TextView超链接5种方式源码实例
- Android根据包名停止其他应用程序的方法
- Android APP存活检测方式
- 利用Android两行代码真正杀死你的App
- android判断应用是否已经启动的实例
- 解决android studio引用远程仓库下载慢(JCenter下载慢)
- 在Android中查看当前Activity是否销毁的操作
- Android 7.0 运行时权限弹窗问题的解决
- Android加密之全盘加密详解
- Android 实现彻底退出自己APP 并杀掉所有相关的进程
- 使用Android开发接入第三方原生SDK实现微信登录
- Android打包篇:Android Studio将代码打包成jar包教程