程序員面臨(並希望我們意識到)的常見問題之一是內存泄漏或任何其他類型的資源泄漏。例如,Windows限制了進程一次可以分配的GDI或USER32對象的數量。當事情走錯路時,您可能希望擁有一些工具來幫助您(再次)找到自由創建自己的正確路徑。
一些IDE具有內置的泄漏檢測功能。MS的Visual Studio最近獲得了一個工具,可以顯示從堆分配的內存塊的列表。遺憾地說,但不僅從堆分配可能會泄漏內存,而且還通過COM / ActiveX技術分配的內存和虛擬內存和文件映射視圖,等等。不幸的是,Visual Studio根本無法檢測到句柄,GDI和USER32資源的泄漏(另一方面,Deleaker可以檢測到所有類型的泄漏,並且也可以在Visual Studio中工作)。
RAD Studio沒有這樣的內置工具。如果在調試期間可以僅單擊“魔術”按鈕,並查看在何處以及通過什么代碼分配了內存,文件和其他描述符,對象,那就太好了。
Deleaker
最近這樣的延伸,Deleaker,它可以做所有這一切以及更多,已被釋放。最初,Deleaker是作為Visual Studio的擴展而創建的,但從今年開始,它開始支持其他IDE,包括RAD Studio和Qt Creator。
您可以在此處下載Deleaker:https://www.deleaker.com/download.html
安裝程序建議將Deleaker添加到計算機上安裝的RAD Studio的版本中:
為了進行快速測試,我們創建一個簡單的Windows VCL應用程序並向其添加內存泄漏:
1
2
3
4
五
6
|
procedure
TForm1
.
FormCreate(Sender: TObject);
var
stringList: TStringList;
begin
stringList := TStringList
.
Create;
end
;
|
然后構建並在調試模式下運行(在調試模式下運行很重要)。返回RAD Studio,找到Deleaker菜單項,選擇Deleaker Window。在出現的窗口中,單擊“拍攝快照”以獲取所有當前分配的列表。其中包括我們的TStringList對象。您可以瀏覽調用堆棧:
如果切換到“ Delphi對象”選項卡,則可以在其中看到按類分組的對象列表:
關閉應用程序窗口以退出該過程。Deleaker立即開始拍攝快照,這是探究尚未釋放哪些內存,哪些對象和其他資源的快照:
另一個有用的功能是比較兩個快照。例如,開發人員意識到一個進程會不斷消耗內存,而不會將其返還,或者GDI對象的數量越來越多。可以只獲取快照並進行瀏覽,但是獲取第一個(基本)快照然后給該過程一些時間來分配新資源要方便得多。最后獲得一個新快照,並查看其與基本快照的區別。
例如,讓我們添加一個計時器,它每半秒將創建一個新對象並打開一個文件:
1
2
3
4
五
6
7
8
|
procedure
TForm1
.
Timer1Timer(Sender: TObject);
var
StringList: TStringList;
begin
StringList := TStringList
.
Create;
CreateFile(
'1.tmp'
, GENERIC_READ, FILE_SHARE_READ
or
FILE_SHARE_DELETE,
nil
, CREATE_ALWAYS,
0
,
0
);
DeleteFile(
'1.tmp'
);
end
;
|
開始調試,切換到Deleaker。您可以在圖上看到如何分配資源:
讓我們拍攝兩個快照,選擇第一個快照,然后單擊“與...比較”以查看區別,即自拍攝第一個快照以來已分配的資源:
因此,快照之間的差異允許查看新的分配,並且非常重要的是命中計數的數量,該數量指示快照分配在代碼中的同一位置。
總而言之,Artem Razin(Deleaker背后的開發人員和Softanics的首席執行官)所做的一件出色的工作。
現在,當涉及到內存浪費問題時,我是madExcept和FASTMM的忠實擁護者。我一直在使用這些技術來對抗內存泄漏。
快速瀏覽,Deleaker是一個有用的擴展,可用於探索內存和其他資源以及查找泄漏。您可以查看特定的分配,甚至可以查看單個對象,並且對於每個對象都可以使用調用堆棧,因此可以輕松找到特定對象或內存的分配位置。試試看。
原鏈接:http://zarko-gajic.iz.hr/deleaker-memory-leaks-hunter-add-on-for-rad-studio/#more-781