當程式的子模組數量和規模擴大之後,在開發階段,系統長時間允許後經常會碰到下面一些bug:
針對上面的三個例子使用中的資源,我們可以歸納成兩類:數量有限的共享資源,比如上面空間有限的記憶體和數量有限的檔案控制代碼;需要獨佔的互斥資源,比如上面例子中提到的鎖。 下面就分別針對這兩種情況,分別展開分析。
共享資源的特點是:總量有限,通過申請介面獲得,使用完了之後通過釋放介面歸還。為了保證不浪費資源,這就要求程式在使用完了申請得到的資源之後,必須及時釋放。而共享資源出現問題的情況,大部分是由於程式設計師遺忘沒有釋放造成的。因此,需要一種內部機制能夠記錄哪些資源使用了還沒有釋放,可以通過下面的步驟實現:
獨享資源的特點是:互斥使用,基本上是先到先得,通過標誌設定是否以備占有。為了保證不死鎖,這就要求:程式在申請某個互斥資源的時候,需要檢查它已經擁有的資源,是否被它正在申請的互斥資源的擁有者申請。
如果是,會死鎖;否則,不會死鎖。同樣也可以通過下面的步驟實現:
根據上面原理的分析,我們不難結合之前講過的xlink、程式堆疊等技巧,選用合適的資料結構來實現。
根據2.1中的分析,需要先構造一張表來記錄這些資源的位址,這張表要求插入方便,刪去也迅速。為此,我們可以用基於平衡二叉樹、優先順序佇列或者hash的方法去實現這個表。對這個表的操作包括pqinsert()/pqremove()/pqempty()等。 此後,就可以開始參考下面列出的針對共享資源洩漏檢查的步驟去實現了。
還是下面以open()、close()為例:
#define file ('f'<<24|'i<<16|'l'<<8|'e')
intint
3.1.4 檢查資源是否洩漏的函式
通常,在程式快要結束退出的時候,會釋放資源,末了可以通過共享資源洩漏檢查函式去檢查是否正的有資源洩漏。這個函式的主要實現的示例如下:
int
fileres_check
(void)
esle
}
3.1.5 記錄可能申請了被洩漏的資源**的位置對獨享資源死鎖的檢查的具體實現依賴的技術同上,差別就在死鎖檢查的邏輯和流程。讀者可以自行嘗試,等有時間了我也可以再來完善。
通過上面的這麼多介紹可以看到,基於對共享資源和互斥資源使用特點的分析,我們能夠提出一種針對共享資源洩漏和獨享資源死鎖檢查的通用原理。借助於合適的資料結構(二叉樹、優先順序佇列或雜湊),基於 xlinker方法、堆疊獲取的api,我們能夠實現一種輕巧的、幾乎不用改動已有**的對開發者非常友好的資源檢查功能。
iOS開發 如何檢查記憶體洩漏
ad 1.靜態分析 通過靜態分析我們可以最初步的了解到 的一些不規範的地方或者是存在的記憶體洩漏,這是我們第一步對記憶體洩漏的檢測。當然有一些警告並不是我們關心的可以略過。2.通過instruments來檢查記憶體洩漏 這個方法能粗略的定位我們在 發生了記憶體洩漏。方法是完成乙個迴圈操作,如果記憶體...
如何檢查C 中的記憶體洩漏
如何檢查c 中的記憶體洩漏 記憶體洩漏是程式設計中常常見到的乙個問題,我所遇過的原因有兩個 1.分配完記憶體後忘記 2.有問題,造成想 卻無法 例如 int p new int p new int p指標修改,原來申請記憶體的位址沒有記錄下來,於是無法釋放 下面介紹如何檢查記憶體洩漏 1.包含標頭檔...
如何檢查C 中的記憶體洩漏
出處 http www.cppblog.com lyt archive 2009 03 22 77517.html 記憶體洩漏是程式設計中常常見到的乙個問題,我所遇過的原因有兩個 1.分配完記憶體後忘記 2.有問題,造成想 卻無法 例如 int p new int p new int p指標修改,原...