2010-12-20 70 views
4

是否可以從我的代碼中以編程方式設置Instruments運行?例如,我想構建我的代碼,像這樣startTrace可能會爲當前線程設置特定的探測器並開始記錄,而stopTrace將停止記錄。我將使用作爲此問題主題的Instruments API編寫這些例程的內容。有沒有Instruments API?

-(void)myInterestingMethod 
{ 
    [self startTrace]; 

    // do something interesting and performance critical 

    [self stopTrace]; 
} 

如果上述不可用,正在建立自己的DTrace探測器一個可行的替代方案?

+0

libdtrace可能是一個選項,但我不確定API是否記錄在案。 – 2011-01-22 07:45:21

+0

我們現在可以使用「興趣點」。請參閱http://stackoverflow.com/a/39416673/1271826。 – Rob 2016-09-09 18:41:39

回答

4

看起來不像有什麼直接的,但有一個instruments命令行工具。下面是一些快速+骯髒的代碼,將調用它和樣品CPU使用率調用進程

static void sampleMe() { 
    // instruments -t '/Developer/Applications/Instruments.app/Contents/Resources/templates/CPU Sampler.tracetemplate' -p 26838 -l 5000 

    NSTask *task = [[NSTask alloc] init]; 
    [task setLaunchPath:@"/usr/bin/instruments"]; 
    [task setArguments:[NSArray arrayWithObjects: 
         @"-t", 
         @"/Developer/Applications/Instruments.app/Contents/Resources/templates/CPU Sampler.tracetemplate", 
         @"-p", 
         [NSString stringWithFormat:@"%ld", getpid()], 
         @"-l", 
         @"5000", 
         nil]]; 
    [task setCurrentDirectoryPath:NSHomeDirectory()]; 
    [task setStandardInput:[NSPipe pipe]]; 
    [task setStandardOutput:[NSPipe pipe]]; 
    [task setStandardError:[NSPipe pipe]]; 
    [task launch]; 
    // purposely leak everything since I can't be bothered to figure out lifetimes 
} 

調用後,一個名爲instrumentscli0.trace文件會在你的主目錄。

更新:儀器4.0提供DTSendSignalFlag在iOS應用程序的DTPerformanceSession。

+1

+1對於「//故意泄漏所有內容,因爲我無法弄清楚生命期」 – Barjavel 2012-08-07 11:05:15

+1

注意:看來DTPerformanceSession只能在模擬器上工作。這對我無用,因爲我只關心設備的性能配置文件。 – 2012-12-26 22:01:28