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
- 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 数组属性和方法
- 快速解释如何使用pandas的inplace参数
- bam格式转bigWig
- 46. Vue路由传参的基本使用
- H3C在端口同时配置MAC地址认证和802.1x
- proxmox notes
- Unix每分钟监控进程的状态
- webpack实战——资源输入与输出
- R语言读取 xlsx 和xls 文件
- pytest文档42-fixture参数化params
- 搭建node服务(三):使用TypeScript
- Antd for Vue使用Form组件报错You cannot set a form field before rendering
- IDEA配置Resin
- BERT详解(附带ELMo、GPT介绍)
- Centos7创建LVM及扩容
- python3 使用session模拟post实现修改活码内容