如何在使用 JNI 的 C++/Java 项目中使用 CRT 中的工具检测内存泄漏?
Posted
技术标签:
【中文标题】如何在使用 JNI 的 C++/Java 项目中使用 CRT 中的工具检测内存泄漏?【英文标题】:How do I detect memory leaks using the tools in CRT in a C++/Java project using JNI? 【发布时间】:2012-03-15 03:09:01 【问题描述】:我已经尝试了几个小时才能让它工作。到目前为止,它确实发现了内存泄漏,但它发现了很多,我不确定这是否现实。另外我想看看文件和行号(我知道这是可能的,但我不能让它工作),这样我就可以真正解决内存泄漏。
我已经添加了代码以在一个经常调用的方法中转储内存泄漏(通常每秒大约 60 次),我不确定它是否可以,但因为我真的没有“主要”函数很难决定把代码放在哪里。
这是我添加的内容:
// This part is in the includes part of the file
#define _CRTDBG_MAPALLOC
#define _CRTDBG_MAP_ALLOC_NEW
#include <stdlib.h>
#include <crtdbg.h>
#ifdef _DEBUG
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define new DEBUG_NEW
#endif
// This part is in the method
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
_CrtDumpMemoryLeaks();
感谢您的帮助!
【问题讨论】:
尝试 deleaker 或类似的调试器 - 它有助于控制内存泄漏和用户对象...它会指示定位错误的行。 问题是我的文件是一个 .jar 文件,而 deleaker 只接受一个 .exe。你知道任何类似的工具可以与通过 JNI 调用 C++ 代码的 Java 程序一起工作吗?谢谢。 当您一直调用 _CrtDumpMemoryLeaks() 时,每次分配都是泄漏。考虑使用 DllMain() 作为一个好的触发器。 【参考方案1】:试试
视觉检漏仪
http://www.codeproject.com/Articles/9815/Visual-Leak-Detector-Enhanced-Memory-Leak-Detectio
我用它取得了很好的效果。
【讨论】:
【参考方案2】:使用 crt,您可以在执行操作之前和之后比较内存状态。为了实现这一点,只需在单元测试中使用 _CrtMemDifference。这个概念是编写单元测试,它将调用代码的不同部分,并在使用 _CrtMemCheckpoint 之前和调用之后获取应用程序内存的状态。因此,之后您必须将两个检查点与 _CrtMemDifference 进行比较。
【讨论】:
以上是关于如何在使用 JNI 的 C++/Java 项目中使用 CRT 中的工具检测内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 JNI 将 Java ByteBuffer 发送到 C?