我正在寻找如何跟踪源代码中的GPU内存泄漏来源的建议。
我有一个庞大的多线程c#/ c ++应用程序,当重复某些特定操作时,它会遇到小而确定的内存泄漏问题。我还在此应用程序旁边运行了内存扫描程序,因此我可以实时跟踪内存使用情况统计信息。因为我知道哪些操作负责内存使用增长,所以我能够概述出现这些不良事件的代码框架。接下来,我在这些帧中放置断点,附加调试器,并逐步检查内存使用峰值。我想跟踪分配内存但从未释放的区域,从而导致泄漏。
我的调查方式非常糟糕(由于代码复杂性和多线程播放,同时也很难)。有没有专业的方法来跟踪和解决这样的问题?
答案 0 :(得分:2)
我使用了一小部分工具,但是我发现以下内容可以提供最简洁的工具来满足您的需求,也许它们适合您的工具:
根据我正在做什么以及我需要跟踪/跟踪和配置文件,我使用上面的所有4个包。他们还有一个额外的好处:免费; b:维护得很好; c:免费; d:定期更新; e:免费。
如果您没有猜到我喜欢免费部分:)
关于对象管理,我建议使用旧的C ++编码原则:只要创建一个对象,添加删除它的行,每个新的应始终(最终)删除。这样你就知道你正在销毁你创建的对象,但它不会从孤立的内存块内存泄漏中拯救你,你可以在这里更改指针的位置,例如:
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 ++,可能需要一段时间才能习惯,但很快就会成为习惯:)