2014-04-04 34 views
5

我正在編寫一些相當複雜的靜態分析和其他程序的動態跟蹤軟件。該程序使用大量靜態DWARF信息來幫助進行跟蹤,包括來自.debug_line DWARF部分的行/列信息。爲了使這個程序具有我們需要的準確性,它必須在DWARF調試信息中填充細緻準確的行和列號信息。使用clang我可以強制使用-g -Xclang -dwarf-column-info選項一起填充行和列信息。如何從clang獲取更多細粒度的行/列調試信息?

但是,在某些情況下,clang不會產生足夠精細的列信息。一個特例是用於for循環。看看下面的例子程序,我將其稱爲source01.c

1  
    2 int main() 
    3 {  
    4  int number1 = 10, number2 = 20; 
    5  for (int i=0; i < 10; ++i) {                               
    6   number1++; 
    7   number2++; 
    8  } 
    9  return 0; 
10 } 

我可以編譯它,如下所示:

clang -g -Xclang -dwarf-column-info source01.c 

其產生可執行a.out。然後我用dwarfdump檢查怎麼行/列信息已被填充:

dwarfdump a.out > dwarf_info 

考慮看看.debug_line部分,我看到所有包含在調試信息這個可執行文件的行/列對:

.debug_line: line number info for a single cu 
Source lines (from CU-DIE at .debug_info offset 0x0000000b): 

<pc>  [row,col] NS BB ET PE EB IS= DI= uri: "filepath" 
NS new statement, BB new basic block, ET end of text sequence 
PE prologue end, EB epilogue begin 
IA=val ISA number, DI=val discriminator value 
0x004004f0 [ 3, 0] NS uri: "/xxx/loop_01/source01.c" 
0x004004fb [ 4, 5] NS PE 
0x00400509 [ 5,10] NS 
0x0040051d [ 6, 9] NS 
0x00400528 [ 7, 9] NS 
0x00400533 [ 5,27] NS 
0x00400548 [ 9, 5] NS 
0x0040054a [ 9, 5] NS ET 

正如你可以看到,有一對(5,10),其對應於int i=0;,以及一對(5,27),其對應於++i。不過,我希望(也需要)也有一對(5,19),這對應於i < 10,但它不在那裏。我用objdump檢查了可執行文件的指令,並確認確實有對應於比較的指令i < 10(因此,它不是簡單地被「優化掉」)。

你有沒有直覺知道爲什麼鏗鏘聲不會填充這些信息?或者有什麼辦法可以強制clang生成更精細的列信息?看來clang應該具備這種能力,因爲clang生成的AST在其自身與源代碼行和列之間具有極其細緻的映射。

謝謝。

+1

由於這會非常解答:我最近有關於鏘類似利基的問題,並決定嘗試尋找在[源代碼](http://clang.llvm.org/get_started.html)。我對編譯器沒有專業知識,我甚至不瞭解C++,但是我發現它很容易找到我需要的東西(請不要把它當成「我比你聰明」 - 我真的被它嚇倒了,從...開始)。也許你的問題比我的更難,但請放手! 或者,在[郵件列表](http://clang.llvm.org/get_involved.html)上詢問。不要忘了回答你自己的問題.. – Brendan

+0

@Brendan感謝您的評論!是的,我們(我的團隊和我)已經考慮通過信息來源進行挖掘並進行一些修改以獲得我們想要的信息。我們肯定可能最終會在未來走這條路。我也發佈了cfe-users(無響應),但我還沒有嘗試發佈到cfe-dev。 – bddicken

回答

0

這是不是一個真正的解決這麼多的藉口,但...

我認爲,第一項(5,8)包括兩個在初始化函數和條件語句for循環代碼。當我用for循環編譯一個程序時,這兩個語句會以連續的地址範圍結束。

這將是很好的強制鏗鏘爲每條語句生成一個單獨的條目,但我似乎無法找到任何可以做到這一點的東西。

相關問題