微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 NVIDIA Jetson 上运行 valgrind 不会提供泄漏源信息

如何解决在 NVIDIA Jetson 上运行 valgrind 不会提供泄漏源信息

tl;dr

valgrind 未显示可访问的内存泄漏源

详情

C++ 应用程序是使用 cmake 构建的,并带有以下额外选项:

set(CMAKE_CXX_FLAGS_DEBUG "-ggdb3 -O0")
set(CMAKE_C_FLAGS_DEBUG "-ggdb3 -O0")

make VERBOSE=1 命令中看到的传递。

运行 /usr/bin/valgrind --num-callers=500 --trace-children=yes --leak-check=full --show-reachable=yes -v --track-origins=yes --show-leak-kinds=all ./aplication --application params输出表明相关符号已加载。

为了检查内存泄漏,valgrind 与 gdb 结合使用,允许在任意时间间隔后检查 valgrind 报告。这些报告表明可访问内存逐渐增加 - 表明存在泄漏。

问题在于 valgrind 没有提供任何可能导致内存泄漏的有用信息。输出如下:

==21466== Searching for pointers to 10,678 not-freed blocks
==21466== Checked 71,211,640 bytes
==21466== 
==21466== 984 bytes in 42 blocks are still reachable in loss record 1 of 6
==21466==    at 0x4845494: operator new(unsigned long,std::nothrow_t const&) (in /usr/lib/valgrind/vgpreload_memcheck-arm64-linux.so)
==21466== 
==21466== 2,560 bytes in 8 blocks are possibly lost in loss record 2 of 6
==21466==    at 0x4846B0C: calloc (in /usr/lib/valgrind/vgpreload_memcheck-arm64-linux.so)
==21466== 
==21466== 17,512 bytes in 3 blocks are still reachable in loss record 3 of 6
==21466==    at 0x4846D10: realloc (in /usr/lib/valgrind/vgpreload_memcheck-arm64-linux.so)
==21466== 
==21466== 405,564 bytes in 977 blocks are still reachable in loss record 4 of 6
==21466==    at 0x4846B0C: calloc (in /usr/lib/valgrind/vgpreload_memcheck-arm64-linux.so)
==21466== 
==21466== 468,429 bytes in 3,965 blocks are still reachable in loss record 5 of 6
==21466==    at 0x4844BFC: malloc (in /usr/lib/valgrind/vgpreload_memcheck-arm64-linux.so)
==21466== 
==21466== 2,166,764 bytes in 5,683 blocks are still reachable in loss record 6 of 6
==21466==    at 0x484522C: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-arm64-linux.so)
==21466== 
==21466== LEAK SUMMARY:
==21466==    definitely lost: 0 bytes in 0 blocks
==21466==    indirectly lost: 0 bytes in 0 blocks
==21466==      possibly lost: 2,560 bytes in 8 blocks
==21466==    still reachable: 3,059,253 bytes in 10,670 blocks
==21466==         suppressed: 0 bytes in 0 blocks

还有什么可以让 valgrind 提供更多关于泄漏源的信息吗?

环境

  • 硬件包:NVIDIA Jetson
  • nv_tegra_release:R32(发布),修订版:5.1,GCID:27362550,董事会:t186ref,EABI:aarch64,日期:UTC 2021 年 5 月 19 日星期三 18:16:00
  • linux 发行版:Ubuntu 18.04.5 LTS
  • cpu 型号:AMD Ryzen 5 3600X 6 核处理器
  • cpu 架构:x86_64
  • valgrind:3.13.0

参考资料

更新

卸载以前通过 apt 安装的 valgrind (v3.13) 并通过 snap 安装 valgrind (v3.17) 解决了问题。

解决方法

如果 valgrind 出现问题,始终建议尝试使用最新版本,无论是最新版本还是 git 版本。

请注意,从源代码重新编译 valgrind 非常容易,因为它的依赖项很少。

如果堆栈跟踪出现特定问题,使用 valgrind + gdb + vgdb 比较 valgrind 和 gdb 产生的堆栈跟踪总是有用的。

在gdb中的相关位置打个断点,然后可以比较gdb backtrace命令产生的gdb stacktrace和监控命令产生的valgrind stacktrace:

(gdb)  monitor v.info scheduler

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?