我尝试使用 setprop libc.debug.malloc = 1 来找出泄漏。
我制作了一个演示程序并在其中引入了内存泄漏,但上述标志无法检测到此泄漏。
我尝试了以下命令:
adb shell setprop libc.debug.malloc 1
adb shell 停止
亚行外壳启动
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 !");
}
任何帮助,将不胜感激。
Thanks
libc.debug.malloc
不是 valgrind。它跟踪本机堆分配,但并不真正直接检测泄漏。与 DDMS 结合使用效果最佳;看这个答案 https://stackoverflow.com/questions/15386339/how-to-use-ddms-for-memory-leaks-in-c-code/15398651#15398651有关使用它进行本机泄漏追踪的信息(也许这个较旧的答案 https://stackoverflow.com/questions/3768463/detecting-native-memory-leaks-in-android-jni-code/3773507#3773507).
(注意你can在最新版本的 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]
而不是p[0]
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)