5

私は、かなり複雑な静的分析と他のプログラムの動的トレースを行うソフトウェアを作成しています。.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、それ自体とソース コードの行および列との間のマッピングが非常にきめ細かく設定されているため、この機能が必要と思われます。

ありがとうございました。

4

1 に答える 1

0

これは言い訳というより解決策ではありませんが...

最初のエントリ (5, 8) には、for ループの初期化子ステートメントと条件ステートメントの両方のコードが含まれていると思います。for ループを使用してプログラムをコンパイルすると、これら 2 つのステートメントが連続するアドレス範囲に配置されます。

ステートメントごとに個別のエントリを生成するようにclangに強制するのはいいことですが、それを行うものを見つけることができないようです。

于 2014-07-25T17:45:48.287 に答える