核心洩露檢測(kmemleak)
核心洩露檢測(kmemleak)
原地址:http://blog.csdn.net/lishenglong666/article/details/8287783
介紹:
Kmemleak 提供了一種可選的核心洩漏檢測,其方法類似於跟蹤記憶體收集器。(http://en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29#Tracing_garbage_collectors)當獨立的物件沒有被釋放時,其報告記錄在 /sys/kernel/debug/kmemleak中。
用法:
CONFIG_DEBUG_KMEMLEAK 在Kernel hacking中被使能,一個核心執行緒每10分鐘(預設值)掃描記憶體,並列印發現新的未引用的物件的數量。
檢視核心列印資訊詳細過程如下:
1、掛載debugfs檔案系統
mount -t debugfs nodev /sys/kernel/debug/
2、開啟核心自動檢測執行緒
echo scan > /sys/kernel/debug/kmemleak
3、檢視列印資訊
cat /sys/kernel/debug/kmemleak
4、清除核心檢測報告,新的記憶體洩露報告將重新寫入/sys/kernel/debug/kmemleak
echo clear > /sys/kernel/debug/kmemleak
記憶體掃描引數可以進行修改通過向/sys/kernel/debug/kmemleak 檔案寫入。 引數使用如下:
off 禁用kmemleak(不可逆)
stack=on 啟用任務堆疊掃描(default)
stack=off 禁用任務堆疊掃描
scan=on 啟動自動記憶掃描執行緒(default)
scan=off 停止自動記憶掃描執行緒
scan=<secs> 設定n秒內自動記憶掃描,預設600s
scan 開啟核心掃描
clear 清除記憶體洩露報告
dump=<addr> 轉存資訊物件在<addr>
通過“kmemleak = OFF”,也可以在啟動時禁用Kmemleak在核心命令列。在初始化kmemleak之前,記憶體的分配或釋放這些動作被儲存在一個前期日誌緩衝區。這個緩衝區的大小通過配CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE設定。
功能實現的基本方法原理
通過的kmalloc、vmalloc、kmem_cache_alloc等記憶體分配會跟蹤其指標,連同其他
的分配大小和堆疊跟蹤資訊,儲存在PRIO搜尋樹。
相應的釋放函式呼叫跟蹤和指標就會從kmemleak資料結構中移除。
分配的記憶體塊,被認為是獨立的,如果沒有指標指向它起始地址或塊的內部的任何位置,可以發現掃描記憶體(包括已儲存的暫存器)。這意味著,有可能沒有辦法為核心通過所分配的地址傳遞塊到一個釋放函式,因此,該塊被認為是一個記憶體洩漏。
掃描演算法步驟:
1。標記的所有分配物件為白色(稍後將剩餘的白色物體
考慮獨立的)
2。掃描儲存器與所述資料片段和棧開始,檢查對地址的值儲存在PRIO搜尋樹。如果
一個白色的物件的指標被發現,該物件將被新增到黑名單
3。掃描的灰色物件匹配的地址(一些白色物體可以變成黑色,並新增結束時的黑名單),直到黑色集結束
4。剩下的白色物體被認為是獨立兒,並報告寫入/sys/kernel/debug/kmemleak。
一些分配的記憶體塊的指標在核心的內部資料結構和它們不能被檢測為孤兒。對
避免這種情況,kmemleak也可以儲存的數量的值,指向一個
內的塊的地址範圍內的地址,需要找到使
塊不被認為是洩漏。其中一個例子是使用vmalloc()函式。
Kmemleak API
------------
見include / linux / kmemleak.h中的函式原型的頭。
kmemleak_init - 初始化kmemleak
kmemleak_alloc - 一個記憶體塊分配的通知
kmemleak_alloc_percpu - 通知的一個percpu的記憶體塊分配
kmemleak_free - 通知的記憶體塊釋放
kmemleak_free_part - 通知釋放部分記憶體塊
kmemleak_free_percpu - 一個percpu記憶體塊釋放的通知
kmemleak_not_leak - 當不是洩露時,標記物件
kmemleak_ignore - 當洩漏時不掃描或報告物件
kmemleak_scan_area - 新增掃描區域內的記憶體塊
kmemleak_no_scan - 不掃描的記憶體塊
kmemleak_erase - 刪除一個指標變數的舊值
kmemleak_alloc_recursive - 為kmemleak_alloc,只檢查遞迴
kmemleak_free_recursive - 為kmemleak_free,只檢查遞迴
處理假陽性/陰性
--------------------------------------
對於假性的記憶體洩漏,但不需要報告的,由於值的記憶體掃描過程中發現kmemleak是指向這樣的物件。為了減少假性報告的數目,kmemleak提供kmemleak_
ignore,kmemleak_scan_area,kmemleak_no_scan,kmemleak_erase的功能,可以指定指標掃描方式,他們的掃描預設情況下不啟用。
對於不能確定是否是記憶體洩露的,kmemleak提供kmemleak_not_leak。kmemleak_ignore的功能可以指定固定型別的資料是否需要掃描或列印,以上具體函式分析詳見3.3詳細處理處理過程及功能函式分析。
有的洩露只是瞬間的,尤其是在SMP系統,因為指標暫時儲存在CPU的暫存器或棧。當記憶體洩漏時Kmemleak定義MSECS_MIN_AGE(預設為1000)一個物件的最低時間。
限制和缺點
-------------------------
主要缺點是減少了記憶體分配和效能釋放。為了避免其他開銷,只進行記憶體掃描,當在/ sys /kernel/debug/ kmemleak檔案被讀取。不管怎樣,這個工具是用於除錯目的,其表現的效能不是重要的。為了保持演算法簡單,kmemleak的值指向任何掃描一個塊的地址範圍內的地址。這可能會導致增加假陰性的報告。然而,它包括真正的記憶體洩漏,最終記憶體洩露將變得可見。
假陰性的另一個來源是資料儲存在非指標值。
在未來的版本中,kmemleak只能掃描指標成員中分配的結構。此功能解決了許多上述假陰性的情況下。
該工具可能存在誤報。這些個案的分配塊可能不需要被釋放(如一些在init_call功能的情況下),這樣的指標通過其他方法計算,與通常的container_of巨集或指標被儲存在一個位置相比不會被kmemleak掃描。頁分配和ioremap不被跟蹤
測試的特定部分kmemleak
---------------------------------------
在初始啟動時,/sys/kernel/debug/kmemleak輸出頁面比較多。這樣的情況下,當檢測指定已經開發的程式碼錯誤時,可以通過清除/sys/kerner/debug/kmemleak的輸出。通過啟動kmemleak的掃描後,你可以找到新的未引用的物件,這應該與測試特定的程式碼段。
詳細步驟如下:
要測試的關鍵部分之前需要清除kmemleak報告:
echo clear > /sys/kernel/debug/kmemleak
測試你的核心或模組...
echo scan =5> /sys/kernel/debug/kmemleak
然後像往常一樣檢視報告:
cat /sys/kernel/debug/kmemleak
已經測試的例項詳見核心文件kmenleak_test.txt文件
1:檢測核心記憶體洩漏的功能
- 關注點1
- 關注點2
* kmemleak_not_leak - mark an allocated object as false positive
* @ptr: pointer to beginning of the object
*
* Calling this function on an object will cause the memory block to no longer
* be reported as leak and always be scanned.
*/
* kmemleak_ignore - ignore an allocated object
* @ptr: pointer to beginning of the object
*
* Calling this function on an object will cause the memory block to be
* ignored (not scanned and not reported as a leak). This is usually done when
* it is known that the corresponding block is not a leak and does not contain
* any references to other allocated memory blocks.
*/
* kmemleak_no_scan - do not scan an allocated object
* @ptr: pointer to beginning of the object
*
* This function notifies kmemleak not to scan the given memory block. Useful
* in situations where it is known that the given object does not contain any
* references to other objects. Kmemleak will not scan such objects reducing
* the number of false negatives.
*/
- 關注點3
that's where your strings go, usually the things you forgot when linking and that cause your kernel not to work. objdump -s -j .rodata .process.o will hexdump it. Note that depending on the compiler, you may have more sections like this. |
- kmemleak_scan()
scan_block(__bss_start, __bss_stop, NULL, 1);
/* per-cpu sections scanning */
for_each_possible_cpu(i)
scan_block(__per_cpu_start + per_cpu_offset(i),
__per_cpu_end + per_cpu_offset(i), NULL, 1);
#endif
* Struct page scanning for each node.
*/
lock_memory_hotplug();
for_each_online_node(i) {
pg_data_t *pgdat = NODE_DATA(i);
unsigned long start_pfn = pgdat->node_start_pfn;
unsigned long end_pfn = start_pfn + pgdat->node_spanned_pages;
unsigned long pfn;
for (pfn = start_pfn; pfn < end_pfn; pfn++) {
struct page *page;
if (!pfn_valid(pfn))
continue;
page = pfn_to_page(pfn);
/* only scan if page is in use */
if (page_count(page) == 0)
continue;
scan_block(page, page + 1, NULL, 1);
}
}
unlock_memory_hotplug();
struct task_struct *p, *g;
read_lock(&tasklist_lock);
do_each_thread(g, p) {
scan_block(task_stack_page(p), task_stack_page(p) +
THREAD_SIZE, NULL, 0);
} while_each_thread(g, p);
read_unlock(&tasklist_lock);
- 問題
相關文章
- 聊聊GenericObjectPool的洩露檢測Object
- 資源洩露檢測《續》薦
- Android 檢測記憶體洩露Android記憶體洩露
- MFC記憶體洩露與檢測記憶體洩露
- C程式記憶體洩露檢測工具——ValgrindC程式記憶體洩露
- 在iOS上自動檢測記憶體洩露iOS記憶體洩露
- MLeaksFinder:精準 iOS 記憶體洩露檢測工具iOS記憶體洩露
- 小白觀察:Firefox 推出密碼洩露檢測服務Firefox密碼
- LeakCanary 傻瓜式的記憶體洩露檢測工具記憶體洩露
- LeakCanary傻瓜式的記憶體洩露檢測工具記憶體洩露
- 如何在vs下linux下檢測記憶體洩露Linux記憶體洩露
- MedusaLocker勒索病毒Debug版本洩露,看我如何高效檢測防禦
- 【YFMemoryLeakDetector】人人都能理解的 iOS 記憶體洩露檢測工具類iOS記憶體洩露
- 使用新版Android Studio檢測記憶體洩露和效能Android記憶體洩露
- 資訊洩露之web原始碼洩露Web原始碼
- DNA 檢測公司 MyHeritage 遭黑客入侵:9200 萬賬戶洩露黑客
- Android記憶體優化——記憶體洩露檢測分析方法Android優化記憶體洩露
- java中如何檢視記憶體洩露Java記憶體洩露
- dp洩露
- 朋友圈測試遊戲易洩露資訊遊戲
- 聊一聊 .NET高階除錯 核心模式堆洩露高階除錯模式
- [CTFHUB]SVN洩露
- malloc_stats---檢查記憶體洩露的神器記憶體洩露
- 檢視 Node.js 中的記憶體洩露Node.js記憶體洩露
- 開源新聞:開源仿生腿、Python 資料管道、資料洩露檢測Python
- vs2008下的MFC程式,怎麼檢測記憶體洩露C程式記憶體洩露
- LeakCanary(二)記憶體洩露監測原理研究記憶體洩露
- C++記憶體洩露檢查的5個方法C++記憶體洩露
- linux下檢查記憶體洩露的工具--mtraceLinux記憶體洩露
- Chrome 新安全特性:檢測到賬號被洩露後向使用者發出提醒Chrome
- (轉載)使用Xcode7的Instruments檢測解決iOS記憶體洩露XCodeiOS記憶體洩露
- 如何防止 goroutine 洩露Go
- 記憶體洩露記憶體洩露
- iOS檢測記憶體洩漏iOS記憶體
- 如何檢測記憶體洩漏記憶體
- 如何防止 goroutine 洩露(二)Go
- js記憶體洩露JS記憶體洩露
- JavaScript記憶體洩露JavaScript記憶體洩露