一種窮人式的內存泄露檢測方式
對于檢測程序代碼中的資源泄露問題,市面上已經有很多工具了,但是今天我再來介紹一種新的方式,這種方式不需要安裝任何工具或者特定的編譯器開關,也不需要第三方庫。
那就是:一直保持程序運行,直到泄露的原因自動水落石出。這是什么意思?
每日自動壓力測試通常是工程開發(fā)中的一個常規(guī)部分。有一些軟件開發(fā)團隊使用屏幕保護程序作為觸發(fā)器,其他團隊使用自定義程序,還有一些團隊需要手動啟動壓力測試,但無論如何,在你下班回到家后,你的計算機連接到測試服務器并接收一組整夜運行的測試。
這些壓力測試經常出現的一件事是這樣或那樣的內存泄漏,由壓力測試團隊識別,因為程序的資源使用率異常高。但是如何調試這些故障呢?這些機器沒有使用泄漏檢測工具運行特殊的檢測版本,因此你無法使用它。
相反,你可以一種新的檢測思路:目標運行平臺有著豐富的資源環(huán)境(target-rich environment)。
假設你的程序正在泄漏內存。連續(xù)大量使用十五小時后,程序開始出現內存不足故障。你顯然在泄露一些東西,但是泄漏的具體是什么呢?
想想看:如果你泄露了一些東西,那么就會有很多。而你沒有泄漏的東西數量很少。因此,如果你隨機抓取進程快照,它很可能是一個泄漏的物體!用數學術語來說,假設程序的正常內存使用量為 15 MB,但由于某種原因,你已經用完了 1693 MB 的動態(tài)分配內存。由于其中只有 15 兆字節(jié)是正常的內存使用量,因此其他 1678 兆字節(jié)必須是泄漏的數據。如果從堆中轉儲隨機地址,則找到泄漏對象的可能性大于 99%。
因此,隨機抓取十幾個地址并轉儲它們。你很可能會一遍又一遍地看到相同的數據模式。那是程序的泄漏點。如果它是一個具有虛擬方法的C++對象,轉儲 vtable 將快速識別它是什么類型的對象。如果是 POD(Plain Old Data) 類型,通常可以通過查找字符串緩沖區(qū)或指向其他數據的指針來識別它是什么。
最終結果可能會有所不同,但我發(fā)現這是一種非常成功的技術,可以把它想象成一種精神力量。
總結
我一直在 Topomel Box 中使用一個外掛式的第三方庫來檢測內存泄露,通過今天的文章,我明白了:我們可以什么也不做,就等它泄露,直至到達泄露原因是如此明顯的時間點。
正所謂:無為而無不為。




























