2014-01-09 22 views
3

我试着用setprop libc.debug.malloc = 1来查找泄漏。 我做了一个演示程序,并介绍了内存泄漏,但上面的标志无法检测到这个泄漏。 我尝试以下命令: 亚行外壳setprop libc.debug.malloc 1 亚行外壳停止 亚行shell启动setprop libc.debug.malloc = 1不起作用

jstring Java_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv* env, 
jobject thiz) { 
int *p = malloc(sizeof(int)); 
p[1] = 100; 
return (*env)->NewStringUTF(env, "Hello from JNI !"); 
} 

任何帮助,将不胜感激。

谢谢

回答

4

libc.debug.malloc是不是valgrind。它跟踪本地堆分配,但并不直接检测泄漏。它最适合与DDMS结合使用;请参阅this answer以获取有关将其用于本机泄漏追踪的信息(也可能是this older answer)。

(请注意,您可以使用的valgrind在最新版本的Android,但得到它建立可以是一个冒险。)

FWIW,不同层次的libc.debug.malloc都在寻找释放后使用,相当不错,缓冲区溢出:

/* 1 - For memory leak detections. 
* 5 - For filling allocated/freed memory with patterns defined by 
*  CHK_SENTINEL_VALUE, and CHK_FILL_FREE macros. 
* 10 - For adding pre-, and post- allocation stubs in order to detect 
*  buffer overruns. 

例如,如果你设置libc.debug.malloc = 10free()呼叫添加到你上面的例子,你可能会因为你设置p[1]而不是p[0]从图书的警告消息。

+0

谢谢。我厌倦了也免费,它给了我日志,但没有提及任何关于lib libhello-jni.so(这是我的项目如此文件),虽然日志有pid和组件包名称,但是,这些信息非常更少(函数名称在哪里会更有帮助)。我也试过valgrind,它提供了内存泄漏和无效写入,但它使应用程序非常缓慢。我需要测试的应用程序在一段时间后随机崩溃。我正在寻找提供内存泄漏和内存损坏的方式,同时应用程序保持相当响应。 – Mayank

+0

将libc.debug.malloc设置为5或10会发现相当多的问题。它不像valgrind那么彻底 - 例如,它不会帮助你处理堆栈转储或未初始化的值,但速度更快。 – fadden