2010-12-20 15 views
4

Ist es möglich, ein Programm programmgesteuert aus meinem Code zu starten? Zum Beispiel möchte ich meinen Code so strukturieren, dass startTrace einen spezifischen Test für den aktuellen Thread einrichtet und die Aufzeichnung startet, während stopTrace die Aufzeichnung stoppt. Ich würde den Inhalt dieser Routinen mit der Instruments API schreiben, die Gegenstand dieser Frage ist.Gibt es eine Instruments API?

Wenn das Obige nicht verfügbar ist, ist das Einrichten meiner eigenen DTrace-Sonde eine brauchbare Alternative?

+0

libdtrace könnte eine Option sein, aber ich bin mir nicht sicher, ob die API dokumentiert ist. –

+0

Wir können jetzt "Points of Interest" verwenden. Siehe http://stackoverflow.com/a/39416673/1271826. – Rob

Antwort

4

Sieht nicht so aus, als gäbe es etwas Einfaches, aber es gibt ein Befehlszeilenprogramm instruments. Hier einig schnell + schmutzig-Code, der es und Probe CPU-Auslastung für den anrufenden Prozess

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 
} 

Nach Aufruf einer Datei mit dem Namen aufrufen instrumentscli0.trace in Ihrem Home-Verzeichnis sein.

Aktualisierung: Instruments 4.0 bietet DTSendSignalFlag in der DTPerformanceSession für iOS-Anwendungen.

+1

+1 für "// absichtlich alles undicht, da ich nicht gestört werden kann, um Lebenszeiten herauszufinden" – Barjavel

+1

Hinweis: Es scheint, dass DTPerformanceSession nur auf dem Simulator funktioniert. Dies ist für mich nicht nützlich, weil mir nur das Leistungsprofil des Geräts wichtig ist. –