3

かなり大きな C++ プロジェクトを Mac OS X で g++ 4.0 を使用するように移植しようとしています。プロジェクトはエラーなしでコンパイルされますが、GDB を正しく動作させることができません。GDB コマンド ラインで「bt」と入力してスタックを表示すると、表示されるすべてのファイル名と行番号が間違っています。

たとえば、GDB スタック トレースによると、私のmain()関数は Mac OS X SDK の stdexcept にあるはずですが、これは意味がありません。

GDB がひどく誤動作する原因は何ですか? コード内の #line ステートメントと #file ステートメントを既にチェックし、コードに unix 行末しかないことを確認しました。また、プロジェクトをクリーンアップして再構築しました。Hello World プロジェクトのデバッグも試みましたが、同じ問題はありませんでした。

問題は、私がリンクしているサードパーティのライブラリの 1 つと、それらのコンパイル方法に関係している可能性がありますか? それとも全く違うものですか?

Xcodeによって実行されるgccとの 2 つの呼び出しの例を次に示します。知る限り、私のプロジェクトのすべての cpp ファイルはコンパイルされ、同じパラメーターでリンクされています。ld

/Developer/usr/bin/gcc-4.0 -x c++ -arch i386 -fmessage-length=0 -pipe -Wno-trigraphs -fpascal-strings -fasm-blocks -O0 -fpermissive -Wreturn-type -Wunused-variable -DNO_BASS_SOUND -D_DEBUG -DXCODE -D__WXMAC__ -isysroot /Developer/SDKs/MacOSX10.5.sdk -mfix-and-continue -fvisibility-inlines-hidden -mmacosx-version-min=10.4 -gdwarf-2 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES -D__WXDEBUG__ -D__WXMAC__ -c "/Users/adriangrigore/Documents/Gemsweeper Mac/TSDLGameBase.cpp" -o "/Users/adriangrigore/Documents/Gemsweeper Mac/build/Gemsweeper Mac.build/Debug/Gemsweeper Mac.build/Objects-normal/ i386/TSDLGameBase.o」

/Developer/usr/bin/g++-4.0 -arch i386 -isysroot /Developer/SDKs/MacOSX10.5.sdk "-L/Users/adriangrigore/Documents/Gemsweeper Mac/build/Debug" -L/Developer/SDKs/MacOSX10 .5.sdk/usr/local/lib -L/opt/local/lib "-F/Users/adriangrigore/Documents/Gemsweeper Mac/build/Debug" -F/Users/adriangrigore/Library/Frameworks -F/Developer/ SDKs/MacOSX10.5.sdk/Library/Frameworks -filelist "/Users/adriangrigore/Documents/Gemsweeper Mac/build/Gemsweeper Mac.build/Debug/Gemsweeper Mac.build/Objects-normal/i386/Gemsweeper Mac.LinkFileList" - mmacosx-version-min=10.4 /opt/local/lib/libboost_program_options-mt.a /opt/local/lib/libboost_filesystem-mt.a /opt/local/lib/libboost_serialization-mt.a /opt/local/lib/ libboost_system-mt.a /opt/local/lib/libboost_thread-mt.a "/Users/adriangrigore/Documents/Gemsweeper Mac/サードパーティ/FreeImage/Dist/libfreeimage.a" "/Users/adriangrigore/Documents/Gemsweeper Mac/サードパーティ/cpuinfo-1.0/libcpuinfo.a" -L/usr/local/ lib -framework IOKit -framework Carbon -framework Cocoa -framework System -framework QuickTime -framework OpenGL -framework AGL -lwx_macd_richtext-2.8 -lwx_macd_aui-2.8 -lwx_macd_xrc-2.8 -lwx_macd_qa-2.8 -lwx_macd_corehtml-2.8 -lwx_macd_adv-2.8 -lwx_macd_ -lwx_base_carbond_xml-2.8 -lwx_base_carbond_net-2.8 -lwx_base_carbond-2.8 -framework SDL -framework Cocoa -o "/Users/adriangrigore/Documents/Gemsweeper Mac/build/Debug/Gemsweeper Mac.app/Contents/MacOS/Gemsweeper Mac"-L/usr/local/lib -framework IOKit -framework Carbon -framework Cocoa -framework System -framework QuickTime -framework OpenGL -framework AGL -lwx_macd_richtext-2.8 -lwx_macd_aui-2.8 -lwx_macd_xrc-2.8 -lwx_macd_qa-2.8 -lwx_macd_html-2.8 - lwx_macd_adv-2.8 -lwx_macd_core-2.8 -lwx_base_carbond_xml-2.8 -lwx_base_carbond_net-2.8 -lwx_base_carbond-2.8 -framework SDL -framework Cocoa -o "/Users/adriangrigore/Documents/Gemsweeper Mac/build/Debug/Gemsweeper Mac.app/Contents/MacOS /ジェムスイーパー・マック」-L/usr/local/lib -framework IOKit -framework Carbon -framework Cocoa -framework System -framework QuickTime -framework OpenGL -framework AGL -lwx_macd_richtext-2.8 -lwx_macd_aui-2.8 -lwx_macd_xrc-2.8 -lwx_macd_qa-2.8 -lwx_macd_html-2.8 - lwx_macd_adv-2.8 -lwx_macd_core-2.8 -lwx_base_carbond_xml-2.8 -lwx_base_carbond_net-2.8 -lwx_base_carbond-2.8 -framework SDL -framework Cocoa -o "/Users/adriangrigore/Documents/Gemsweeper Mac/build/Debug/Gemsweeper Mac.app/Contents/MacOS /ジェムスイーパー・マック」8 -framework SDL -framework Cocoa -o "/Users/adriangrigore/Documents/Gemsweeper Mac/build/Debug/Gemsweeper Mac.app/Contents/MacOS/Gemsweeper Mac"8 -framework SDL -framework Cocoa -o "/Users/adriangrigore/Documents/Gemsweeper Mac/build/Debug/Gemsweeper Mac.app/Contents/MacOS/Gemsweeper Mac"

Xcode デバッガーに関する同様の質問を既にここで行っていることに注意してください。ただし、これは実際には Xcode のせいではなく、GCC / ld / GDB の問題であることを知ったので、再投稿します。

編集:私のプロジェクトでは、次のサードパーティ ライブラリを使用しています: SDLBoostwxWidgets。これがこの問題にとって重要かどうかはわかりませんが、念のために言及したかっただけです。

Xcode SDL プロジェクト テンプレートをコンパイルしようとしましたが、同じ問題は発生しなかったため、私のプロジェクトの何か特別なことが原因であるに違いありません。

2 番目の編集: ちょうど分かったように、「これは自動的に生成されたものです」という文字列を含むファイルを検索する際に間違いを犯しました。私が使用しているサードパーティのライブラリの 1 つであるFreeImageにすべて属している、同じ文字列を持つ数十のファイルを見つけました。そのため、問題は FreeImage に関連しているようですが、どうすればよいかまだわかりません。

4

11 に答える 11

3

私のgdbバージョンが私のg ++​​バージョンと一致しなかったときに、これらの症状が発生しました。

最新の gdb を取得してみてください。

于 2012-12-10T09:56:34.167 に答える
1

cppファイルには確かにデバッグシンボルが含まれています(-gdwarf-2オプション)。

デバッグシンボルに別のdSYMファイルを使用していますか?または、オブジェクトファイル内にありますか。私は最初にdSYMファイルでDWARFを使用して、それが役立つかどうかを確認します(またはその逆)。

ただし、サードパーティのライブラリはリリースビルドのように見えます(もちろん、自分で名前を変更しない限り)。たとえば、boostが-dライブラリ名のmonnikerを使用してデバッグライブラリを示していることは確かです(たとえばlibboost_filesystem-mt-d.a)。

さて、これは実際には問題を引き起こさないはずです、それはあなたがサードパーティのライブラリに対して行われた呼び出しに足を踏み入れることができないことを意味するはずです。(少なくとも、そうするときは意味がありません;)しかし、問題があるので、それらのライブラリのデバッグバージョンとリンクしてみる価値があるかもしれません...

于 2009-02-27T16:24:18.917 に答える
1

XCode SDL プロジェクト テンプレートをコンパイルしようとしましたが、同じ問題は発生しなかったため、私のプロジェクトで特別なことが原因であるに違いありません。

正しい。あなたのプロジェクト設定は違うものです。

デバッグ ビルドの Xcode プロジェクト設定でデバッグの最適化を無効にする必要があります。残念ながら、Xcode では、GDB が順番に移動することが予想されるときに、GDB が奇妙な行 (順不同) にジャンプします。

プロジェクト設定に移動します。以下を設定します

1) Instruction Scheduling   = None
2) Optimization Level       = None [-O0]
3) ZERO_LINK                = None

これを行った後、問題は解決するはずです。設定を変更する必要があるプロジェクト設定画面は次のとおりです。

代替テキスト

于 2009-03-04T05:10:38.103 に答える
1

最適化をオンにしてコンパイルしていますか?私は、O2 以上がシンボルをかなり混乱させ、gdb とコア ファイルをほとんど役に立たなくすることを発見しました。

また、必ず -g オプションを指定してコンパイルしてください。

于 2009-02-27T16:33:46.320 に答える
1

テストのために、 addr2line が期待値を与えるかどうかを確認できます。もしそうなら、これはあなたのコンパイル/リンクパラメータによって生成されたELFに問題がないことを示し、 GDB にすべての疑いを投げかけます。そうでない場合は、ツールと ELF ファイルの両方にまだ疑いがあります。

于 2009-03-03T09:34:52.627 に答える
1

SDLを使用している可能性はありますか? mainメインに名前が付けられるようにSDLが再定義さSDL_mainれ、SDLパーツが大幅に最適化される可能性があるため、適切なgdb出力を取得するのに問題が発生します。

...ちょっとした考え

これを読む

于 2009-03-03T09:36:47.643 に答える
0

私はあなたが試すことができる新しいものを持っています.

自分自身の直前にmain書くことができます

#ifdef main
#  error main is defined
#endif

int main(int argc, char *argv[]) {

を再定義するヘッダーがある場合、これによりエラーが発生するはずですmain

独自のものを定義すると、以前の定義が作成された場所で警告が表示される場合があります

#define main foo

int main(int argc, char *argv[]) {

undefまた、あなたの直前にしようとすることができますmain

#undef main

int main(int argc, char *argv[]) {
于 2009-03-08T10:16:29.037 に答える
0

数年前、Codewarrior コンパイラから Xcode に移行したときに、これに遭遇しました。これを回避する方法は、フラグ " -fno-inline-functions" を Other C Flags に入れることだと思います (Dev のみ)。

この問題は、PowerPC アーキテクチャでより顕著でした。

「-fvisibility-inlines-hidden」フラグと「-mfix-and-continue」フラグを削除するとどうなりますか?

「修正して続行」機能が適切に機能したことはありません。

于 2009-03-05T16:10:15.843 に答える