記得這是某位朋友在一年多以前遇到的問題。當時他需要分析程式中各個 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 的頭像
novus

novus log

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


留言列表 (2)

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

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

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

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