2015-09-25 56 views
5

我目前正在尋找解決REST客戶端的Mac實現中的明顯內存泄漏的方法。的代碼以產生所述內存泄漏是以下的(運行XE8,更新1):德爾福REST mac內存泄漏

program mac_REST_leak_test; 
{$APPTYPE CONSOLE} 
{$R *.res} 

uses 
    System.SysUtils, REST.Client, REST.Types, IPPeerClient; 

var 
    request : TRestRequest; 
    ii, iMax : integer; 
begin 
    iMax := 1; 
    for ii := 0 to iMax do 
    begin 
     request := TRestRequest.Create(nil); 
     // Fake Online REST API for Testing and Prototyping 
     request.Client := TRestClient.Create('http://jsonplaceholder.typicode.com/'); 
     request.Method := rmPOST; 
     request.Execute(); 

     request.Client.Free(); 
     request.Free(); 
    end; 
end. 

這是演示泄漏的代碼的最小的塊。基本上,我有一個同步服務,每隔一段時間就會發出一次REST請求。

當我在Windows上運行這個使用MadExcept時,沒有發現泄漏。在ProcessMonitor中檢查正在運行的進程顯示正在使用的內存量沒有增加。

但是,當在Mac上運行時,活動監視器會顯示分配給應用程序的內存繼續增加。此外,使用Instruments運行時,似乎在Mac上處理幾個URL和HTTP類的泄漏。

有誰知道如何解決這個泄漏? (另外,確切地知道漏洞來自Mac上的位置真的很有幫助,但唯一列出的Delphi類是TMethodImplementationIntercept。我相信這是由於Delphi不會爲Mac的一個的dSYM文件。如果有人知道周圍的方式,這將是真棒呢!)

UPDATE 通過改變從1 iMax至10和比較FastMM4輸出,它看來,泄漏是在類Macapi.ObjectiveC.TConvObjID.XForm。與1次迭代相比,10次迭代輸出包含9次更多的泄漏,將其作爲堆棧跟蹤。我已經把這個報告給Embarcadero作爲RSP-12242。

+0

BTW'TMethodImplementationIntercept'是**不是**類 –

+1

FastMM是否存在Mac?它是否提供詳細的泄漏報告? –

+0

請報告這個質量portal。 –

回答

2

是FastMM4在最新的SVN修訂版中支持OSX泄漏報告。不幸的是,一個簡單的空的Delphi FMX應用程序的「全局」泄露使得難以分析mem-logfile。 XE10中已經修復了一些泄漏,但MacApi.ObjectiveC橋中的某些對象仍然會產生泄漏。我曾在Quality Central & Quality Portal(QC & QP)報告過。所以使用FastMM4進行泄漏檢測很困難。

請分開Delphi對象泄漏和ObjectiveC泄漏,其次你可以用儀器找到。

+1

我沒有使用最新的SVN修訂版。謝謝! – jllangston

+0

我沒有使用FMX進行這個測試,並且刪除了上面代碼中的循環,FastMM4報告了一些泄漏。 1838年列出的大部分都很小,但800字節範圍內有2個字節,2000字節範圍內有一個。 – jllangston