跟踪GPU内存泄漏的专业方法(分配而不释放)
Professional ways of tracking GPU memory leakage (allocation without deallocation)
我正在寻找如何在源代码内跟踪GPU内存泄漏起源的建议。
我有一个大型的多线程c#/c++应用程序,当重复一些特定的操作时,它会出现小的但确定的内存泄漏问题。我还在这个应用程序旁边运行内存扫描仪,这样我就可以实时跟踪内存使用统计数据。因为我知道哪些操作会导致内存使用量的增长,所以我能够勾勒出发生这些问题的代码框架。接下来,我在这些帧中放置断点,附加调试器,并逐步检查内存使用峰值。我想跟踪内存被分配,但从未释放,从而导致泄漏的区域。
我的调查方式真的很糟糕(同时由于代码复杂性和多线程的影响而很难)。有什么专业的方法来跟踪和解决这些问题吗?
我使用的工具很少,但我发现以下这些工具最能满足我的需求,也许它们也能满足你的需求:
- 来自AMD的CodeXL: http://developer.amd.com/tools-and-sdks/heterogeneous-computing/codexl/
- Nvidia NSight: https://developer.nvidia.com/gameworks-tools-overview Nvidia Visual Profiler: https://developer.nvidia.com/nvidia-visual-profiler
- gDebugger: http://www.gremedy.com/
根据我正在做的事情以及我需要跟踪/跟踪和配置文件的内容,我使用上述所有4个包。它们还有一个额外的好处:免费;B:保养得很好;c:免费;D:定期更新;艾凡:免费的。
如果你还没有猜到我喜欢免费的部分:)
关于对象管理,我将推荐一个古老的c++编码原则:一旦你创建了一个对象,添加了删除它的行,每个new应该总是(最终)有一个delete。这样你就知道你正在销毁你创建的对象,但是它不会使你免于孤立的内存块内存泄漏,因为你改变了指针指向的位置,例如:
myclass* firstInstance = new myclass();
myclass* secondInstance = new myclass();
firstInstance = secondInstance;
delete firstInstance;
delete secondInstance;
您现在将创建一个小的内存泄漏,其中实际firstInstance的数据现在没有被任何指针指向。当这种情况在大型代码库中发生时,很难检测到,而且应该更常见。
一般来说,这些是您需要注意的对,以确保您正确地处理所有对象:
new -> delete
new[] -> delete[]
malloc() -> free() // or you can use realloc(0) instead of free()
calloc() -> free() // or you can use realloc(0) instead of free()
realloc(nonzero) -> free() // or you can use realloc(0) instead of free()
如果你是从一个有垃圾回收的语言过渡到c++,这可能需要一段时间来适应,但它很快就会成为习惯:)
相关文章:
- 正在理解智能指针,但出现错误:未分配正在释放的指针
- 调用析构函数以释放动态分配的内存
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- 错误:malloc:对象 0x7f9edf504080 的 *** 错误:未分配正在释放的指针
- 给定一个指向堆分配内存的指针,智能指针实现如何为其找到合适的释放函数?
- 是否可以使用分配器对象来释放另一个分配器分配的内存?
- 释放动态分配的内存时是否需要执行此额外步骤
- 整数内存分配/释放
- 我是否需要在 c++ 中从本地指针中释放分配的内存?
- 未分配释放C++(C 字符串)指针
- 未分配被释放的指针(将堆栈实现为链表时)
- 在不释放所有动态分配的资源的情况下结束程序是否有风险
- Unique_ptr:在列表中放置时未分配释放的指针
- C++内存分配/释放和自由空间错误
- 带有QT的C 应用中的IIMEBRA代码给出malloc:***对象XXXXXX的错误:未分配释放的指针
- 删除引用时出现未分配释放的指针错误
- 指针的内存分配/释放
- 内存分配/释放错误(非常小的代码)
- c++堆内存分配/释放
- 内存管理——用于分配/释放I/O缓冲区的现代c++风格