2009-07-09 8 views
8

Ho problemi in esecuzione gprof su OS X. Il file test.c è:problema con gprof su OS X: [programma] non è l'architettura dell'host

#include <stdio.h> 

int main() { 
    printf("Hello, World!\n"); 
    return 0; 
} 

e mio terminale si presenta come:

$ gcc -pg test.c 
$ gcc -pg -o test test.c 
$ ./test 
Hello, World! 
$ gprof test 
gprof: file: test is not of the host architecture 

Modifica: inoltre, non genera il file gmon.out.

Cosa sta succedendo qui?

+0

ha generato il file gmon.out per voi? Non sono in grado di farlo con il tuo esempio. –

+0

No, non è così. Ho dimenticato di controllare questo. Suppongo che questo significhi che il problema inizi prima? –

risposta

9

si suppone che la serie di eventi qui a lavorare come segue:

  1. codice di compilazione con l'opzione -pg
  2. codice
  3. collegamento con l'opzione -pg
  4. programma Run
  5. programma genera gmon.out il file
  6. Run gprof

Il problema è che il passaggio 4 non avviene mai. Ci sono poche informazioni su questo specifico fallimento. Il consenso generale degli ultimi anni sembra essere che Apple preferirebbe invece usare lo squalo, e sono stati molto negligenti nel correggere bug e simili con gprof.

In breve: installare Xcode, man shark

+0

Dovrò controllare lo squalo. Non ho mai avuto problemi a ottenere un programma per generare 'gmon.out' a condizione che il programma esca in modo pulito. IIRC, l'opzione della riga di comando del profiler inserisce il codice nell'inizializzazione e nella conclusione del runtime per attivare l'acquisizione dei contatori di runtime e, in definitiva, la scrittura del file di output. Finché il programma esce con il ritorno da 'main' o da una chiamata esplicita a' exit() ', dovrebbe generare un file di output. –

3

Sembra che test sia costruito utilizzando un'architettura che non è prevista per gprof. Provare quanto segue:

$ cat > test2.c 
#include <stdio.h> 
int main() { printf("test\n"); return 0; } 
^D 
$ gcc -arch i386 -pg -o test2 test2.c 
$ file test2 
test2: Mach-O executable i386 
$ ./test2 
test 
$ gprof test2 
... bunch of output ... 
$ gcc -arch ppc -pg -o test2 test2.c 
$ file test2 
test: Mach-O executable ppc 
$ ./test2 
test 
$ gprof test2 
gprof: file: test2 is not of the host architecture 
$ arch -ppc gprof test2 
... same bunch of output ... 

La più recente MacOS supporta l'esecuzione eseguibili da entrambi l'architettura x86 di IBM PPC e Intel. Parte della catena di strumenti sembra essere un po 'densa a riguardo. Gprof sembra aspettarsi che l'eseguibile si trovi nell'architettura nativa. Tuttavia, se si utilizza l'utilità arch per forzare l'esecuzione dell'architettura non nativa, sembra che funzioni correttamente. C'era un discussion about this in another context poco fa. Ho incluso alcuni link utili e alcune informazioni in più.

+0

Quando compilo con -arch i386 o -arch ppc, ottengo lo stesso errore da gprof (e nessun file gmon.out viene generato in entrambi i casi) –

+0

Questo è strano ... di solito uno o l'altro funzionerà. Quale versione dell'hardware e del sistema operativo stai utilizzando? L'errore è sicuramente causato da una mancata corrispondenza tra l'architettura dell'eseguibile e l'architettura host. Questo è menzionato esplicitamente nella pagina di manuale 'gprof' sotto _UNIVERSAL FILE SUPPORT_ sul mio MacBook Pro - Intel Core 2 Duo, OS 10.5.7. Si può anche usare 'arch' senza argomenti per vedere quale sia l'architettura nativa e guardare' gcc -v' per vedere quale sia la specifica '--target =' per il compilatore. –

+0

Sto anche usando OS 10.5.7, Intel Core 2 Duo. Chiamando 'arch' restituisce' i386', e 'gcc -v' mostra' Target: i686-apple-darwin9' –

4

Sfortunatamente, gprof non funziona su Mac OS X. Probabilmente vorrai usare Shark. Fa parte degli strumenti di sviluppo in /Developer/Applications/Performance Tools/Shark.

Aggiornamento: Sembra che gprof ora funzioni su Mac OS X 10.6 (Snow Leopard), utilizzando gli strumenti di sviluppo più recenti.

+0

Qualche motivo per cui gprof non funziona su OS X? OS X non dovrebbe essere compatibile con gli strumenti UNIX? –