8

デバッグしようとしている単純なc++プログラムがありますが、gdbはライブラリのオブジェクトファイルを見つけることができず(またはデバッグ情報が利用できません)、実行可能ファイルのデバッグシンボルも見つけることができないようです。

私はOSX10.5.8をMacPortsで使用しており、コードを次のようにコンパイルします。

g ++-mp-4.5 -Wall -pedantic -std = c ++ 0x -g -ggdb -I / opt / local / include -L / opt / local / lib -lgsl -static-libstdc ++ MCMC-simplex.cpp -o mcmc

(ファイルは1つだけで、g++-mp-4.5はgcc/ g ++ 4.5のmacports実行可能ファイルです)

結果の実行可能ファイルでgdbを実行しようとすると、(起動時に)次の形式のエラーメッセージが多数表示されます。

警告:オブジェクトファイル"/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_lang_gcc45/work/build/i386-apple-darwin9/libgcc/trunctfdf2_s.o"-"のデバッグ情報が見つかりませんでした。 /../../gcc-4.5.0/libgcc/../gcc/config/soft-fp/trunctfdf2.c"。

これは、macportsのビルド中にバグがあることを示しています(gdbが一時ビルドディレクトリでオブジェクトファイルを探しているようです)。

プログラムがgdb(Appleから提供されたもの)にリストされているのを見ると、でランダムな.sファイルを検索しようとします/var/tmp。これは、アセンブラーファイルのように聞こえます。そのため、私のプログラムのデバッグシンボルも見つからないようです。

MacPorts gdb 7.1を試してみると、

警告: `/var/folders/Xa/XaqHO9PeEC8K-Nrd0L9xWk+++TM/-Tmp-//cc2IvFto.o':シンボルを読み取るために開くことができません:そのようなファイルまたはディレクトリはありません。(デバッグシンボルが見つかりません)...完了しました。

そして、Appleのgdbが出す多くのエラーメッセージのどれも(最終結果は同じですが)。

誰かがこの問題に遭遇し、解決策を思いついたことがありますか?

4

3 に答える 3

11

他のUNIXenとは異なり、MacOSではデバッグ情報は実行可能ファイルにリンクされていません。代わりに、実行可能ファイルにはリンクされたオブジェクトファイルのリストがあり、デバッガーはこれらの個々のオブジェクトファイルでデバッグ情報を探します。

オブジェクトファイルを削除すると、デバッグできなくなります。

「シングルステップ」で実行可能ファイルをコンパイルしてリンクすると、GCCは次のことを行います。

  1. アセンブリファイルを作成する/tmp/[random-string].s
  2. に組み立てます/tmp/[random-string].o
  3. 、などとリンク/tmp/[random-string].oして実行可能ファイルにします。crt0.olibcmcmc
  4. 削除/tmp/[random-string].oして.s

デバッグを妨げるのはその最後のステップです。

解決:

g++-mp-4.5 -Wall -pedantic -std=c++0x -g -ggdb -c MCMC-simplex.cpp
g++-mp-4.5 MCMC-simplex.o -lgsl -static-libstdc++ -o mcmc

これMCMC-simplex.oにより、現在のディレクトリに残り、GDBがその中のデバッグ情報を見つけることができるようになります。

于 2010-07-31T03:02:46.007 に答える
5

さて、単一のコンパイルとリンクのステップを続行するためのもう1つの「トリック」は
-save-temps=obj
、g++コマンドラインに追加して次のようにすることです。

4/tmp/[random-string].oおよび.sを削除します

実際には実行されません(実際には、一部の一時フォルダーでは、RANDOM-STRING。[os]の代わりに、ビルドしているディレクトリに正規のSOURCE.oファイルとSOURCE.sファイルがありますが、観点からはデバッグシンボルを見つけるのは問題ありません

于 2010-11-12T12:21:46.360 に答える
2

2つの問題があったようです。1)実行可能ファイルのデバッグシンボルがないことと、2)警告を生成した一部の共有ライブラリのデバッグシンボルがないことです。私も問題を抱えていました2)。雇用されたロシア人は1)​​と答え、2)の正しい方向に私を向けました。

まず、警告に記載されているライブラリをデバッグする必要がない場合は、無視しても問題ありません。しかしもちろん、警告は煩わしく、他の問題を隠す可能性があります。あなたの場合と私の場合、MacPortsによってインストールされたライブラリは、デバッグシンボルが削除されているはずですが、削除されていません。警告を発生させる理由は、Employed Russianが言うように、シンボル自体は、インストールされたライブラリではなく、ビルドプロセス中に生成されたオブジェクトファイルに保持されるためです。ライブラリは、(最小限の)デバッグ情報の一部としてオブジェクトファイルへのポインタを格納します。

これは、stringsコマンドで確認できます。libsomething.dylibのロード時に/crazy/path/to/something.oが見つからないという警告が表示された場合:

strings - libsomething.dylib | grep something.o

'-'が必要であることに注意してください(これは私が初めて得たものです)。

これを修正するには、次のようにデバッグ情報を削除します。

strip -S libsomething.dylib

その後、「dwarfdump --file-stats libsomething.dylib」は、「STABSdebug」セクションが空であることを示すはずです。(オブジェクトファイルへのリンクはSTABSデバッグ形式で保存されます。)

これ以上醜い警告はありません..イェーイ!

それは難しすぎました

于 2011-04-08T03:12:53.103 に答える