2010-06-26 46 views
4

我剛剛把我的頭髮拉出來,試圖讓儀器咳嗽起來,故意造成內存泄漏。我的測試示例如下所示:在Mac上使用儀器進行內存泄漏檢查

class Leaker 
{ 
public: 
    char *_array; 
    Leaker() 
    { 
     _array=new char[1000]; 
    } 

    ~Leaker() 
    { 
    } 
}; 

void *leaker() 
{ 
    void *p=malloc(1000); 
    int *pa=new int[2000]; 
    { 
     Leaker l; 
     Leaker *pl=new Leaker(); 
    } 
    return p; 
} 

int main (int argc, char **argv) 
{ 
    for (int i=0; i<1000; ++i) { 
     leaker(); 
    } 
    sleep(2); // Needed to give Instruments a chance to poll memory 
    return 0; 
} 

基本上,儀器從未發現明顯的泄漏。我爲什麼要瘋了,但後來在泄漏面板下的「泄漏配置」面板中發現了「自動檢測之間的秒」。我把它撥回到最低點,這是1秒鐘,並將睡眠(2)放在我的密碼中,瞧;發現泄漏!

就我而言,泄漏就是泄漏,無論它發生在應用程序30分鐘或30毫秒內。在我的情況下,我將測試用例剝離回上面的代碼,但我真正的應用程序是一個沒有UI或任何東西的命令行應用程序,它運行速度非常快;肯定小於默認的10秒採樣間隔。

好的,所以我可以在儀表模式下退出我的應用程序時生活幾秒鐘,但我真正想要的是簡單地在退出時使用Instruments快照內存,然後在應用程序中隨時隨地執行任何操作在跑。

所以......問題是:是否有辦法在應用程序退出時使儀器快照存儲,而不管採樣間隔?

乾杯,

巴蒂爾

回答

3

儀器,泄漏模式對於泄漏追蹤真的很強大,但我發現它更偏向基於事件的GUI應用程序不是命令行程序(特別是那些短時間後退出)。曾經有一個CHUD API,您可以在其中編程控制檢測的各個方面,但最後一次嘗試它時,框架不再作爲SDK的一部分提供。也許現在有些替換爲Dtrace

此外,請確保您與Xcode保持同步,因爲這方面有一些最新的改進,可能會使您更容易做到您需要的功能。您也可以在退出之前保留短暫的延遲,但以環境變量的存在爲條件,然後在您的應用的Instruments啓動屬性中設置該環境變量,以便在Instruments外運行不會有延遲。

+0

是的,我同意,Instruments似乎適用於事件驅動的環境。另外,由於iPad/iPhone編程,我的XCode始終處於最新版本。 DTrace是一個很好的建議,我會研究它。 在這一點上,我真的認爲我會在最後2秒鐘離開。它有效,但有點煩人。 – Shane 2010-06-29 02:33:10

0

我剛剛決定在調試+泄漏構建期間離開2秒延遲。

1

大多數單元測試代碼執行所需的代碼路徑並退出。雖然這對於單元測試來說是完全正常的,但它爲泄漏工具創建了一個問題,這需要時間來分析進程內存空間。要解決這個問題,你應該確保你的單元測試代碼在完成測試後不會立即退出。您可以通過將進程無限期地休眠而不是正常退出來做到這一點。

https://developer.apple.com/library/ios/documentation/Performance/Conceptual/ManagingMemory/Articles/FindingLeaks.html