2014-04-17 55 views
6

我試圖創建一個類似TraceGL的工具,但對於C型語言:處理gcov的數據文件,用於跟蹤目的

enter image description here

正如你所看到的,上面的亮點代碼的工具是流動沒有以紅色執行。例如,在構建Objective-C的這個工具方面,我知道gcov(和clang中的libprofile_rt)輸出數據文件,這些文件可以幫助確定某個給定的代碼行被執行了多少次。但是,gcov數據文件能夠告訴我程序執行期間何時出現給定的代碼行?例如,如果在代碼路徑A和B期間調用第X行,我能夠從gcov確定代碼路徑A和B被稱爲第X行給定行X嗎?

回答

0

據我所知,GCOV儀器儀表數據只能告訴代碼中的某個點是執行了(可能有多少次)。但是這些代碼點之間沒有關係。

這聽起來像你想要的是通過代碼確定路徑。要做到這一點,您需要對代碼進行靜態分析(需要完整的C語言分析器,名稱解析器,流量分析器),您需要將動態檢測點以執行順序結合在一起。

第一個要求你找到能夠處理C的所有榮耀的機器;你不想重複自己。 GCC,Clang,我們的DMS工具包是可供選擇的。我知道GCC和Clang做了非常認真的分析,我敢肯定,你至少可以找到內部控制流程分析;我知道DMS可以做到這一點。你必須定製GCC和Clang來提取這些數據。你必須配置DMS來提取這些數據;配置比定製更容易,因爲它是設計屬性而不是「自定義」操作。因人而異。

然後,使用GCOV數據,您可以確定GCOV數據點之間的流量。我不清楚,除非您的目標是展示執行痕跡,否則這會爲您購買超出靜態控制流分析的任何內容。

要做到這一點動態,你可以做的是強制每個數據收集點在檢測代碼中注意它是最近遇到的點;在這之前,它會記錄最近遇到的點。這實際上會產生與控制流匹配的點之間的引用鏈。從您的角度來看,這有兩個問題,我認爲:a)您必須修改GCOV或其他工具來插入這種不同類型的儀器,b)您必須擔心在何時以及如何記錄「前輩」時數據收集點不止一次被擊中。

0

gcov(或lcov)是一種選擇。它確實產生了大部分您正在查找的信息,但這些文件的更新頻率取決於調用__gcov_flush()的頻率。它並不是真正意圖實時的,並且不包括您正在尋找的所有信息(特別是「何時」)。有一個gcov數據格式here和頭文件here的簡短摘要。 lcov數據被描述爲here

對於你在找什麼DTrace應該能夠提供你所需要的所有信息,並且是實時的。對於蘋果平臺上的Objective-C,在運行時有dtrace探測器,可以讓你跟蹤任何東西。有許多有用的指南和例子可以幫助您瞭解dtrace以及如何編寫腳本。 Brendan Gregg提供了一些非常好的例子。 Big Nerd Ranch已經完成了series of articles