2009-11-14 5 views
16

Ich verwende Xcode unter OSX, um Befehlszeilen-C-Anwendungen zu entwickeln. Ich möchte auch Instrumente verwenden, um Speicherlecks zu profilieren und zu finden.Wie Verwenden von Instrumenten und Anzeigen der Konsole in Befehlszeilenanwendungen

Ich konnte jedoch keine Möglichkeit finden, die Konsole anzuzeigen, wenn Sie die Anwendung von Instrumenten aus starten. Ich bin auch nicht in der Lage zu einem laufenden Befehlszeile Prozess anhängen (es beendet mit einem Fehler):

Hier ist ein Beispielcode:

#include <stdio.h> 
#include <signal.h> 
#include <stdlib.h> 
#include <setjmp.h> 

static sigjmp_buf jmpbuf; 

void handler(int sig) { 
    char c[BUFSIZ]; 

    printf ("Got signal %d\n", sig); 
    printf ("Deseja sair? (s/n) "); 

    fgets(c, sizeof(c), stdin); 

    if(c[0] == 's') { 
     exit(0); 
    } else { 
     siglongjmp(jmpbuf, 1); 
    } 
} 

int main(void) { 
    char buf[BUFSIZ]; 

    signal(SIGINT, handler); 

    sigsetjmp(jmpbuf, 1); 

    while(1) { 
     printf(">>>"); 
     fgets(buf, sizeof(buf), stdin); 
     printf ("Introduziu: %s\n", buf); 
    } 

    return(0); 
} 

Hier ist der Fehler, den ich bekam, nachdem Instruments starten, und zu versuchen, befestigen zum laufenden Prozess in xcode:

[Switching to process 1475] 
[Switching to process 1475] 
Error while running hook_stop: 
sharedlibrary apply-load-rules all 
Error while running hook_stop: 
Invalid type combination in ordering comparison. 
Error while running hook_stop: 
Invalid type combination in ordering comparison. 
Error while running hook_stop: 
Error while running hook_stop: 
Error while running hook_stop: 
Error while running hook_stop: 
Error while running hook_stop: 
Error while running hook_stop: 
Error while running hook_stop: 

Unable to disassemble __CFInitialize. 

Irgendwelche Gedanken?

Antwort

4

Siehe this question für Ihre Antwort.

Von Brad Larson darin:

Führen Sie Ihre Anwendung aus Xcode die Konsolenausgabe geleitet, dort zu haben. Während Ihre Anwendung läuft, starten Sie Instrumente und wählen Sie ein geeignetes Instrument. Wählen Sie unter Standardziel in der Menüleiste die Option iPhone oder Computer (je nachdem, was für Ihre Tests geeignet ist) und unter Anhängen an den Prozess den Namen der ausführbaren Datei.

Wenn Sie auf die Aufnahme-Schaltfläche klicken, sollte Ihre Anwendung unter Instrumente profiliert werden, während ihre Konsolenausgabe an Xcode gerichtet ist. Leider muss dieser Anhangsprozess nach dem Start der Anwendung erfolgen. Daher müssen Sie möglicherweise den Start Ihrer Anwendung separat profilieren.

Edit: Wenn das nicht funktioniert, müssen Sie möglicherweise nur den Computer neu zu starten. Hast du das schon gemacht?

+0

Ich habe das versucht, aber es ist fehlgeschlagen. Bitte sehen Sie meine modifizierte Frage. Danke. –

+0

Über den Neustart: aber _of natürlich_: D –

2

Sie können die Ausgabe im Dropdown-Menü Optionen ändern, wenn Sie Ihr Ziel auswählen. Die Ausgabe erscheint in der Systemkonsole (Programme/Dienstprogramme/Konsole).

IO options

+0

Das scheint keinen Unterschied zu machen. – trojanfoe

+1

Es funktioniert, wenn Sie Instrumente von einem Terminal aus starten (führen Sie '/ Programme/Xcode.app/Contents/Applications/Instruments.app/Contents/MacOS/Instruments' auf meinem Computer aus). Wenn Sie dies tun und "System Console" wählen, erhalten Sie die Ausgabe. – cobbal

+0

Wenn ich es von einem Terminal aus starte, bekomme ich nichts - überhaupt keine Ausgabe und keine GUI. –

15

Es ist ein wenig spät zu diesem alten Thread zu tragen, aber ich gefunden habe, der beste Weg, um ein Kommandozeilenprogramm von Profilierungs ist iprofiler (manpage) zu verwenden. Auf diese Weise kann Daten von der Kommandozeile einfach gesammelt werden, indem diese zu Beginn der Befehlszeile hinzufügen:

iprofiler -leaks -d $HOME/tmp 

(Ich habe ein eigenes temporäres Verzeichnis auf $HOME/tmp, so dass Sie vielleicht /tmp oder lassen Sie die -d verwenden müssen Befehlszeilenoption insgesamt deaktiviert).

Meine Testskripts fügen das automatisch zur Befehlszeile hinzu, wenn $FINDLEAKS definiert ist (und unter Linux valgrind vorausgeht).

Dies erzeugt dann eine .dtps Datei (eigentlich ein Verzeichnis), die geladen und analysiert werden kann mit Instruments.

Wenn Sie kompilieren verwenden clang dann sowohl einfach hinzufügen -O3 und -g (Klirren nicht die -pg Befehlszeilenoption unterstützen).