2014-01-09 61 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