フルパスからの解放その4

  • 投稿日:
  • by
  • カテゴリ:



うひょひょ。gcc/gasにもオプションがあったぜよ。


これで今後は、デバッグ用バイナリ配布するときに、恥ずかしいディレクトリ名を晒さずに住むわけですな。(ピコーン)


3.9 Options for Debugging Your Program or GCC


http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html#Debugging-Options



-fdebug-prefix-map=old=new
When compiling files in directory old, record debugging information describing them as in new instead.
<超訳>ディレクトリ「old」でコンパイルして、「new」でコンパイルしたような内容のデバッグ情報を記録する。

さっそく手元で試すと・・・



$ g++ -g -fdebug-prefix-map=/home/syasuda/src/sandbox/placec/=/home/syasuda/src/sandbox/placea/ -o placea main.cpp
# placecでコンパイルしつつ、placeaのパスを記録したい
$ addr2line -e placea 0x80484f4
/home/syasuda/src/sandbox/placec/main.cpp:4
# あかんやんorz...

これってもしかして、文字列置換してるだけ?


ということは・・・



$ g++ -g -fdebug-prefix-map=/home/syasuda/src/sandbox/placec/=/home/syasuda/src/sandbox/placea/ -o placea /home/syasuda/src/sandbox/placec/main.cpp
# placecでコンパイルしつつ、placeaのパスを記録したい
$ addr2line -e placea 0x80484f4
/home/syasuda/src/sandbox/placea/main.cpp:4

お~。なんともイマイチな機能。イマサンくらいですかねこりゃ。


ですが、Makefileの書き方によっては、フルパスでgccに渡している場面も散見しますから、その場合はなかなか良いのではないでしょうか。


バージョン:



$ gcc --version
gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3

というわけでめずらしくまとめです。


gdbでデバッグするときにソースのパスでハマる関係のまとめ



  • gdbでデバッグするときにはset substitute-pathでソースのパスをfakeできる

    • コンパイル時と違うルートにあるソースツリーをソース表示に使える

      • コマンドファイルにdirectoryコマンドの羅列すると今後、赤恥(gdb6.6以降なら)になる予定

        • 「コンパイル時とおなじディレクトリ構成」を強制したりする間抜けルールも滅亡予定







  • gcc -gでデバッグ情報に記録されるソースのパスはフルパスがデフォルトである

    • 理由はよく分からない



  • バイナリに記録されているパスをbinutilsのaddr2lineで確認できる

  • gcc -fdebug-prefix-map=old=newで、デバッグ情報に記録されるソースのディレクトリをfakeすることができる

    • gasに--with-debug-prefix-map=がある

    • 自分が作ったバイナリを人に渡して、「恥ずかしい」パス((例えば「kaihatsu」とか(笑)))が表示されて「こいつローカルで、こんなパス名使ってるんだ・・・」と思われないで済む




gdbのコマンドファイルで、directoryコマンドの羅列を見て、辟易してからもう4年ですか。


長かった。というかgdbの仕事がなかった・・・


参考リンク:


gccのML Re: Debug info path remapping


http://sourceware.org/ml/binutils/2007-07/msg00134.html


(追記)


フルパスからの解放は、コンパイルマシンとデバッグマシンが異なる場合にも効果を発揮します。