我正在編寫一些相當複雜的靜態分析和其他程序的動態跟蹤軟件。該程序使用大量靜態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在其自身與源代碼行和列之間具有極其細緻的映射。
謝謝。
由於這會非常解答:我最近有關於鏘類似利基的問題,並決定嘗試尋找在[源代碼](http://clang.llvm.org/get_started.html)。我對編譯器沒有專業知識,我甚至不瞭解C++,但是我發現它很容易找到我需要的東西(請不要把它當成「我比你聰明」 - 我真的被它嚇倒了,從...開始)。也許你的問題比我的更難,但請放手! 或者,在[郵件列表](http://clang.llvm.org/get_involved.html)上詢問。不要忘了回答你自己的問題.. – Brendan
@Brendan感謝您的評論!是的,我們(我的團隊和我)已經考慮通過信息來源進行挖掘並進行一些修改以獲得我們想要的信息。我們肯定可能最終會在未來走這條路。我也發佈了cfe-users(無響應),但我還沒有嘗試發佈到cfe-dev。 – bddicken