2009-11-14 9 views
16

J'utilise Xcode sur OSX pour développer des applications de ligne de commande C. Je voudrais également utiliser des instruments pour profiler et trouver des fuites de mémoire. Cependant, je ne pouvais pas trouver un moyen d'afficher la console lors du lancement de l'application à partir d'Instruments. Je suis également incapable de joindre à un processus de ligne de commande en cours d'exécution (il sort avec une erreur):Comment utiliser les instruments et afficher la console dans les applications de lignes de commande

Voici un exemple de code:

#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); 
} 

Voici l'erreur que je suis arrivé après le lancement instruments, et d'essayer de joindre au processus en cours dans 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. 

Des idées?

Répondre

4

Voir this question pour votre réponse.

de Brad Larson y:

Lancez votre application à partir de Xcode pour avoir la sortie de la console d'ambiance là-bas. Pendant que votre application est en cours d'exécution, démarrez Instruments et choisissez un instrument approprié. Sous Cible par défaut dans la barre de menus, sélectionnez iPhone ou Ordinateur (selon ce qui est approprié pour ce que vous testez), et sous Joindre au processus trouvez le nom de votre exécutable.

Lorsque vous cliquez sur le bouton d'enregistrement, votre application doit commencer à être profilée sous Instruments tout en dirigeant la sortie de la console vers Xcode. Malheureusement, ce processus de pièce jointe devra venir après le démarrage de l'application, vous devrez peut-être profiler le démarrage de votre application séparément.

Edit: Si cela ne fonctionne pas, vous aurez juste besoin de redémarrer votre ordinateur. Avez-vous déjà fait ça?

+0

J'ai essayé, mais il a échoué. S'il vous plaît voir ma question modifiée. THX. –

+0

A propos du redémarrage: mais _of course_: D –

2

Vous pouvez modifier la sortie dans la liste déroulante Options lorsque vous choisissez votre cible. La sortie apparaîtra dans la console système (Applications/Utilities/Console).

IO options

+0

Cela ne semble pas faire de différence. – trojanfoe

+1

Cela fonctionne si vous lancez des instruments depuis un terminal (exécutez '/ Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/MacOS/Instruments' sur mon ordinateur). Si vous faites cela et sélectionnez "System Console" vous obtenez la sortie. – cobbal

+0

Lorsque je le lance à partir d'un terminal, je n'ai rien - pas de sortie du tout, et pas d'interface graphique. –

15

Il est un peu tard pour contribuer à ce vieux fil, mais je l'ai trouvé la meilleure façon de profiler une ligne de commande utilitaire est d'utiliser iprofiler (manpage). Cela permet aux données d'être collectées à partir de la ligne de commande en ajoutant simplement ceci au début de la ligne de commande:

iprofiler -leaks -d $HOME/tmp 

(j'ai un répertoire temporaire privé à $HOME/tmp, donc vous pourriez avoir besoin d'utiliser /tmp ou quitter le -d option de ligne de commande désactivée). Mes scripts de test ajoutent automatiquement cela à la ligne de commande si $FINDLEAKS est défini (et ajoutera valgrind s'il est exécuté sous Linux).

Ceci génère ensuite un fichier .dtps (en fait un répertoire) qui peut être chargé et analysé en utilisant Instruments.

Si vous compilez en utilisant clang alors simplement ajouter à la fois -O3 et -g (clang ne prend pas en charge l'option de ligne de commande -pg).

Questions connexes