我尝试使用setprop libc.debug.malloc = 1来查找泄漏。 我做了一个演示程序并引入了内存泄漏,但上面的标志无法检测到这个泄漏。 我试过下面的命令: adb shell setprop libc.debug.malloc 1 adb shell停止 adb shell start
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 !");
}
任何帮助都将不胜感激。
由于
答案 0 :(得分:5)
libc.debug.malloc
不是valgrind。它跟踪本机堆分配,但不直接检测泄漏。它最适合与DDMS结合使用;有关将其用于本地泄漏追踪的信息,请参阅this answer。(或许this older answer)。
(注意你可以在最近的Android版本上使用valgrind,但设置它可能是一次冒险。)
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 = 10
并添加free()
调用,则可能会收到来自库的警告消息,因为您设置了p[1]
而不是{ {1}}。