2012-11-28 61 views
5

我正在使用Apple LLVM Compiler 4.1在Xcode 4.5上運行的iOS項目上生成代碼覆蓋數據文件(.gdca和.gcno)。如何使用gcovr爲iOS生成Cobertura格式的xml文件?

在Library/Developer/Xcode/DerivedData/viewer-evgaabclrjcouydwveuptwroeofm/Build/Intermediates/viewer.build/Coverage-iphonesimulator/viewer_generic/viewer_generic.build/Objects-normal/i386下正在生成文件。

所有(.o,.d,.dia,.gcda,.gdno)文件都位於此目錄下。沒有子文件夾。

我可以使用Cover Story打開單個的.gcda文件。現在我想生成一個可以使用cobertura查看的報告。

我想爲此使用gcovr。在終端我到上面的文件夾

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> 

我看到一個警告:gcno:版本「404」,喜歡「402」

請幫我找出原因gcovr無法生成報表。

+0

嗨,你是否能夠做到這一點? –

回答

6

Tl; dr:LLVM輸出的代碼覆蓋率文件比gcovr預期的要新。如果您將gcovr的版本替換爲鏈接的版本(版本2.4),那麼它應該可以工作。也許。

在LLVM之前,Xcode使用GCC作爲它的編譯器。 GCC包含一個名爲'gcov'的工具,它生成所有這些文件,.gcno,.gcda及其類似文件。

那時,Mac已經預裝了(而且仍然是)GCC 4.2版本。所以Xcode會用gcc 4.2編譯你的項目,然後運行gcov 4.2版本,它會生成4.2版本的測試覆蓋文件。這對於gcovr來說工作得很好,因爲前2.0版本的alpha版本似乎是用gcov 4.2編寫的。

但是,當蘋果切換到LLVM時,事情變得麻木。如果您在目標設置中設置了「生成測試覆蓋率文件」標誌,LLVM還會輸出gcov樣式的測試覆蓋率文件。但是,LLVM默認輸出gcov 4.4文件,而不是4.2。

This person有想法,如果我們能告訴LLVM輸出4.2版本的文件(我認爲這可能在技術上可以),那麼它會解決這個問題。這可能是真的,但我不知道該怎麼做。

但是,我找到了解決方案。我打開了終端,並檢查了我的版本gcovr的:

gcovr --version 

它告訴我,我gcovr的版本實際上gcovr 2.0搶鮮。 此版本不支持gcov 4.4版本的測試覆蓋率文件。

所以我找到了一個版本。

在此處,其託管的網頁:https://software.sandia.gov/trac/fast/wiki/gcovr

這裏是鏈接到腳本本身:https://software.sandia.gov/trac/fast/export/2800/gcovr/trunk/scripts/gcovr

這個腳本是gcovr 2.4,它支持高達4.8的gcc。從理論上講,它應該對4。LLVM輸出的4個版本的測試覆蓋文件。這個警告現在完全沒有了。給它一個鏡頭,讓我知道它是怎麼回事!

+0

這是如何回答這個問題的? –

+0

這將全面回答問題。答案不僅解釋瞭如何解決警告,它解釋了警告存在的原因。 –

+0

@Gardner感謝信任投票。丹尼爾,你是對的,答案並不完全簡潔。我在頂部添加了一個簡短版本。 – churowa

1

您是否正確指定了您的對象目錄路徑?根據gcovr文檔

--object-directory = OBJDIR:指定包含gcov數據文件的目錄。 gcovr必須能夠識別* .gcda文件和gcc最初運行的目錄之間的路徑。通常,gcovr可以正確猜測。此選項覆蓋gcovr的正常路徑檢測,並可以指定從gcc到gcda文件的路徑(即傳遞給gcc的'-o'選項的路徑)還是從gcda文件到gcc原始工作目錄的路徑。

下面的命令在我的項目的根目錄下運行時適用於我。

gcovr -r。 --object目錄path_to_coverage_files -x> coverage.xml

凡path_to_coverage_files是所有你(的.o,.D,.dia,.gcda,.gdno)文件的目錄。