記得這是某位朋友在一年多以前遇到的問題。當時他需要分析程式中各個 branch 和 statement 的執行統計資料,那時候我跟他建議 gcov,但沒多久他就跟我抱怨說 gcov 在 Mac OS X 上無法使用。因為這不是我關心的問題,而且我手邊沒有任何 Mac 系列的開發環境,所以就沒有繼續深究。

今天我們又談到同樣的話題,強者我友早就解決這個問題,他眼也不眨一下就直接在編譯器內部增加一個 compile pass,使編譯器自動在被編譯程式的每個 basic block 植入計數程式碼,最後再寫個分析程式處理統計資料。這差不多是 gcov 的工作方式,只是自己做的比 gcov 更直接符合需求。

接下來要講的是,我終於知道為何在 Mac OS X 上使用 gcov 會有問題。原因在於 Mac OS X 預設的 gcc/g++ 指令並非執行真正的 gcc/g++,而是 alias 成 llvm-gcc。因為 LLVM 並沒有提供相關的 code instrumentation 服務,所以不會吐出 gcov 可用的資訊,改用正牌的 gcc 或者 clang 應該就沒有問題了。以上資訊提供給有同樣需求的網友參考,不過我不是 Mac 使用者,所以有問題別找我。

所以我朋友真正需要做的只是安裝正港GCC,然後就可以正常使用 gcov 了。不過自己改寫編譯器或許可以獲得更多的控制能力,也不見得是多此一舉。

novus 發表在 痞客邦 PIXNET 留言(2) 人氣()


留言列表 (2)

發表留言
  • edisonx
  • 有地方有點模糊想確認,這篇文做的事情,是在 compile 成 obj 時,分析其 branch instruction 使用量 ? 還是直接改寫類似 gcc.exe 這種 compiler ? 謝謝您的回覆。
  • 直接改寫編譯器後端,編譯器會在被編譯的程式每個 basic block 植入一小段統計程式。

    概念和 profile 類似,不過可以 cover 到非常精細的範圍,例如個別的 statement。查一下 gcov 這個程式的用途,就知道是幹麼用的。

    novus 於 2012/06/06 19:56 回覆

  • edisonx
  • 查了一下,令人感到有趣的東西,謝謝 novus 大的分享。