私は、かなり複雑な静的分析と他のプログラムの動的トレースを行うソフトウェアを作成しています。.debug_line
このプログラムは、 DWARF セクションからの行/列情報を含む、多くの静的 DWARF 情報を使用してトレースを支援します。このプログラムが必要な精度を持つためには、DWARF デバッグ情報に取り込まれる、きめ細かく正確な行番号と列番号の情報が必要です。I を使用すると、オプションを一緒にclang
使用して行と列の情報を強制的に入力できます。-g -Xclang -dwarf-column-info
ただし、clang が十分に細かい列情報を生成しない場合があります。1 つの特定のインスタンスは forfor
ループです。次のサンプルプログラムを取り上げます。これを と呼びます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 にはclang
、それ自体とソース コードの行および列との間のマッピングが非常にきめ細かく設定されているため、この機能が必要と思われます。
ありがとうございました。