2012-11-28 9 views
5

Sto generando file di dati di copertura del codice (.gdca e .gcno) su un progetto iOS in esecuzione su Xcode 4.5 utilizzando Apple LLVM Compiler 4.1.Come si generano i file xml in formato Cobertura usando gcovr per iOS?

file vengono generati in Library/Developer/Xcode/DerivedData/viewer-evgaabclrjcouydwveuptwroeofm/costruire/Intermedi/viewer.build/Copertura-iphonesimulator/viewer_generic/viewer_generic.build/Oggetti-normali/i386.

Tutti i file (.o, .d, .dia, .gcda, .gdno) si trovano in questa directory. Non ci sono sottocartelle.

io sono in grado di aprire i file .gcda individuali utilizzando Cover Story. Ora voglio generare un rapporto che può essere visualizzato usando la cobertura.

Sto cercando di utilizzare gcovr per questo. Sul terminale sono arrivato alla cartella sopra

Command: gcovr -r `pwd` -x -v 

Output: 
(Several lines of similar output as below) 
Running gcov: 'gcov /Users/abc/Library/Developer/Xcode/DerivedData/viewer-evgaabclrjcouydwveuptwroeofm/Build/Intermediates/viewer.build/Coverage-iphonesimulator/viewer_generic/viewer_generic.build/Objects-normal/i386/FILE_NAME.gcda --branch-counts --branch-probabilities --preserve-paths --object-directory /Users/abc/Library/Developer/Xcode/DerivedData/viewer-evgaabclrjcouydwveuptwroeofm/Build/Intermediates/viewer.build/Coverage-iphonesimulator/viewer_generic/viewer_generic.build/Objects-normal/i386' in '/Users/abc/Library/Developer/Xcode/DerivedData/viewer-evgaabclrjcouydwveuptwroeofm/Build/Intermediates/viewer.build/Coverage-iphonesimulator/viewer_generic/viewer_generic.build/Objects-normal/i386' 
    Parsing coverage data for file /Users/abc/Documents/Perforce/DPS-MacBookPro/depot/sandbox/Viewer-Labatt/Blue/viewers/ipadviewer/iphone/apps/viewer/Classes/view/zooming/FILE_NAME.mm 
    Filtering coverage data for file /Users/abc/Documents/Perforce/DPS-MacBookPro/depot/sandbox/Viewer-Labatt/Blue/viewers/ipadviewer/iphone/apps/viewer/Classes/view/zooming/FILE_NAME.mm 
    Gathered coveraged data for 0 files 
    <?xml version="1.0" ?> 
    <!DOCTYPE coverage 
     SYSTEM 'http://cobertura.sourceforge.net/xml/coverage-03.dtd'> 
    <coverage branch-rate="0.0" line-rate="0.0" timestamp="1354144430" version="gcovr 2.4 (r2774)"> 
     <sources> 
      <source> 
       /Users/abc/Library/Developer/Xcode/DerivedData/viewer-evgaabclrjcouydwveuptwroeofm/Build/Intermediates/viewer.build/Coverage-iphonesimulator/viewer_generic/viewer_generic.build/Objects-normal/i386 
      </source> 
     </sources> 
     <packages/> 
    </coverage> 

sto vedendo un avvertimento: GCNO: versione '404', preferiscono '402'

Ti prego, aiutami a capire perché gcovr non è in grado di produrre il report.

+0

Ciao, sei riuscito a farlo funzionare? –

risposta

6

Tl; dr: i file di copertura del codice che le uscite LLVM sono più recenti di quelle previste da gcovr. Se sostituisci la tua versione di gcovr con la versione collegata (versione 2.4), allora dovrebbe funzionare. Può essere.

Indietro prima di LLVM, Xcode ha utilizzato GCC come compilatore. GCC includeva uno strumento chiamato 'gcov', che generava tutti quei file, .gcno, .gcda e il loro ilk.

Allora, Mac è venuto preinstallato (e ancora lo fanno) con GCC versione 4.2. Quindi Xcode compilerebbe il tuo progetto con gcc 4.2 e quindi eseguirà gcov versione 4.2, che genererebbe file di copertura di prova con versione 4.2. Questo ha funzionato bene per gcovr, perché la versione alfa pre-2.0 sembra essere stata scritta con gcov 4.2 in mente.

Ma quando Apple passati a LLVM, le cose andarono squirrely. LLVM emette anche i file di copertura del test in stile gcov, se si imposta il flag "Genera file di copertura del test" nelle impostazioni di destinazione. BUT, LLVM ha come impostazione predefinita l'emissione di file gcov 4.4, NON 4.2.

This person ha avuto l'idea che se potessimo dire a LLVM di produrre la versione 4.2 dei file (penso che tecnicamente sia in grado di farlo), allora risolverebbe il problema. Probabilmente è vero, ma non so come farlo.

Ho comunque trovato una soluzione per me. Ho aperto terminale, e controllato la mia versione di gcovr:

gcovr --version 

E mi ha detto che la mia versione di gcovr è stato effettivamente gcovr 2.0 prerelease. Questa versione non supporta le versioni di gcov 4.4 dei file di copertura del test.

Quindi ho trovato una versione che funziona.

Ecco la pagina che lo ospita: https://software.sandia.gov/trac/fast/wiki/gcovr

Ed ecco il link allo script stesso: https://software.sandia.gov/trac/fast/export/2800/gcovr/trunk/scripts/gcovr

Questo script è gcovr 2.4, che supporta fino a GCC 4.8. In teoria, dovrebbe essere abbastanza soddisfatto del 4.4 versioni dei file di copertura del test emessi da LLVM. Questo avvertimento ora è completamente sparito per me. Fai un tentativo, fammi sapere come va!

+0

Come risponde la domanda? –

+0

Questo risponde alla domanda in modo completo. Non solo la risposta spiega come aggirare l'avviso, ma spiega perché l'avviso esiste. –

+0

@Gardner Grazie per il voto di fiducia. Daniel, hai ragione, la risposta non è esattamente succinta. Ho aggiunto una versione breve in alto. – churowa

1

Stai specificando correttamente il percorso della directory dell'oggetto? In base alla documentazione gcovr

--object-directory = OBJDIR: specificare la directory che contiene i file di dati gcov. gcovr deve essere in grado di identificare il percorso tra i file * .gcda e la directory in cui gcc era originariamente eseguito. Normalmente, gcovr può indovinare correttamente. Questa opzione sovrascrive il normale rilevamento dei percorsi di gcovr e può specificare il percorso da gcc al file gcda (ad esempio, quello che è stato passato all'opzione '-o' di gcc) o il percorso dal file gcda alla directory di lavoro originale di gcc.

Il seguente comando funziona per me quando viene eseguito nella directory principale del progetto.

gcovr -r. --object-directory path_to_coverage_files -x> coverage.xml

Se le path_to_coverage_files è la directory in cui tutti i vostri (.o .gdno, .de, .dia, .gcda,) file sono.

Problemi correlati