setprop libc.debug.malloc = 1无效

时间:2014-01-09 18:37:11

标签: android memory-leaks android-ndk native

我尝试使用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 !");
}

任何帮助都将不胜感激。

由于

1 个答案:

答案 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}}。