2

いくつかのデバッグ タスクを自動化しようとしています。場合によっては、$ra[これは MIPS マシンです] の値とスタックの一部を 16 進アドレスとして出力します。デバッグ中に、それらをペアaddr2lineに変換するために使用します。file:line

この手順を自動化したい。

問題は、 addr2line が__FILE__コンパイル時の値と同等のファイル名を返すことです。つまり、コンパイラに渡されるファイルの名前です。これは通常foo.c、時々src/foo.cです。私のプロジェクトには合計で数百のディレクトリがあるため、これだけではファイルを一意に識別できない場合があります ( 、 などがある場合があります1/foo.c) 2/foo.c。決定論的であったとしても、引数ごとに画面で検索を開始するのはかなり非効率的です [ハッシュ テーブルを作成して保存できると思いますが、これを単純な bash スクリプトとして保持したいと思います]。

GDB は適切なファイルを取得しているようです。デバッグ シンボルを含む実際のソース ファイルを見ると、ファイル名の直後に__FILE__[つまり、__FILE__issrc/foo.cであり、実際には にある場合、ファイルに表示されるフル パスがあるように見えることも/home/me/projects/something/comp1/src/foo.cわかり/home/me/projects/something/comp1ます。これをプログラムで取得するにはどうすればよいですか?

ありがとう。

4

1 に答える 1

1

This is very surprising behavior. I'm unable to reproduce it in:

  • Linux with gcc 4.1.2 and addr2line 2.17.50.0.6

  • Cygwin with gcc 4.3.4 and gcc 3.4.4 and addr2line 2.20.51.20100410

addr2line should rely on the debug information stored in the executable. And the debug information should contain absolute paths (regardless of what source path was given to the compiler) in order to avoid any ambiguities when using a debugger. Everywhere I try it, addr2line always shows an absolute path.

Assuming you are using make for your build system, one option, albeit a probably painful one, would be to change your makefiles to use a non-recursive strategy (something you really ought to be doing anyway). With such a system, only a single instance of make is running, from a single working directory (usually the top-level of your source tree). Therefore all invocations of the compiler specify the full path to the source file (relative to the root of the source tree). This would solve your problem if, in fact, addr2line always shows the filenames as they were specified to the compiler. Not the best solution, but one that would work. And as a side benefit, you'd get all the advantages of non-recursive make.

于 2010-07-30T14:28:49.793 に答える