2009-02-27 8 views
3

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

たとえば、GDBスタックトレースによれば、私のmain()関数はMac OS X SDKのstdexceptにあると考えられていますが、これは意味をなさないものです。

GDBが誤動作する原因は何ですか?私は既に#lineと#fileのステートメントを自分のコードでチェックし、コードにはunixの行末しかないことを確認しました。私はまた、プロジェクトをきれいにして再構築しました。私はHello Worldプロジェクトのデバッグも試みましたが、同じ問題はなかったと思います。

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

Xcodeによって実行されるgccldへの2つのコール例があります。 AFAIK私のプロジェクト内のすべてのcppファイルがコンパイルされ、同じパラメータでリンクされます。

/Developer/usr/bin/gcc-4.0 -x C++ -arch I386 -fmessage長= 0 -pipe -Wno-トリグラフ-fpascal-ストリング-fasmブロック-O0 -fpermissive -Wreturn-タイプ-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 "/ユーザ/ adriangrigore /ドキュメント/ Gemsweeper マック/ TSDLGameBase.cpp" -o「/ユーザ/ adriangrigore /ドキュメント/ Gemsweeper マック/ビルド/ Gemsweeper Mac.build/Debug/Gemsweeper Mac.build/Objects-normal/i386/TSDLGame Base.o "

/Developer/usr/bin/g++-4.0 -arch i386の -isysroot /Developer/SDKs/MacOSX10.5.sdk " -L /ユーザ/ adriangrigore /ドキュメント/ Gemsweeper マック/ビルド/ Debug " -L/Developer/SDKs/MacOSX10.5.sdk/usr/local/lib -L/opt/local/lib" -F/Users/adriangrigore/Documents/Gemsweeper Mac /ビルド/デバッグ " -F /ユーザ/ adriangrigore /ライブラリ/フレームワーク -F /開発/ SDKに/ MacOSX10.5.sdk /ライブラリ/ -filelistを「フレームワーク/ユーザ/ adriangrigore /ドキュメント/ Gemsweeper マック/ビルド/ Gemsweeper Mac.build/デバッグ/ Gemsweeper Mac.build/Objects-normal/I386/Gemsweeper Mac.LinkFileList」 -mmacosxバージョン分= 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 「/ユーザ/ adriangrigore /ドキュメント/ Gemsweeper マック/サードパーティ /FreeImage 「 "/ユーザ/ adriangrigore /ドキュメント/ Gemsweeper マック/サードパーティ /cpuinfoの-1.0/ -Lは/ usr/local/libの" libcpuinfo.a -framework IOKitの-frameworkカーボン-frameworkココア/Dist/libfreeimage.a -frameworkシステム-framework QuickTime -framework OpenGL -framework AGL -lwx_macd_r ichtext-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-28 -framework SDL -frameworkココア-o "/ユーザ/ adriangrigore /ドキュメント/ Gemsweeper マック/ビルド/デバッグ/ Gemsweeper Mac.app/Contents/MacOS/Gemsweeperマック"

は私が既に持っていることに注意してくださいXcodeデバッガhereに関する同様の質問がありましたが、実際にはXcodeの障害ではなく、GCC/ld/GDBの問題であることがわかったので、私は再ポストしています。

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

私はXcode SDLプロジェクトテンプレートをコンパイルしようとしましたが、同じ問題は発生しませんでした。そのため、私のプロジェクトでは特別なことが必要です。

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

+0

起動時にgdbは警告を出力しません。 – epatel

+0

私はあなたが何かを上書きする可能性のある、ポインタベースのバグを持っていると思っています... – epatel

+0

gdbは起動時に何の警告も出さない。 –

答えて

1

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

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

サードパーティのライブラリはリリースビルドのようですが(ただし、自分で名前を変更しない限り)私は、ライブラリ名の中で-dのmonnikerを使用して、デバッグライブラリ(例:libboost_filesystem-mt-d.a)を使用していることを確認しています。

これは実際には問題にならないはずです。つまり、サードパーティ製のライブラリへの呼び出しに入ることはできません。あなたが問題を抱えているので、それらのライブラリのデバッグバージョンにリンクしてみる価値があるかもしれません...

+0

"stabs"、 "dwarf"、 "dwarf-with-dsym"(これらはXCodeが私にデバッグ情報形式として提供する3つのオプションです)を使って再コンパイルを試みましたが、助けられませんでした。私は、スタブを使用すると、メインの場所が別のファイルにあると考えられていたことに気がつきましたが、それはまだ完全に間違っていました。 –

1

あなたは最適化でコンパイルしていますか?私はO2以上のシンボルがかなり混乱していることがわかりました.GDBとコアファイルはほとんど役に立ちません。

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

+0

いいえ、上記のようにO0でコンパイルが行われます。 –

+0

私は上記のようにプロジェクトをコンパイルするための-gdwarf-2オプションを試しています。 –

1

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

+0

これは愚かな質問かもしれませんが、これを試すにはどのように適切な関数のアドレスを見つけるのですか? –

+0

私は、マップファイルから簡単に知ることができる埋め込みプラットフォームで動作する傾向がありますが、gdbに接続するときに停止するアドレス(stdexceptに表示されています)を入力し、addr2lineがそのアドレスをmain )。 –

1

SDLを使用している可能性はありますか? SDLはmainを再定義して、メインの名前はSDL_mainとなり、SDLの部分は重く最適化されている可能性があります。そのため、gdbの出力がうまくいかない場合があります。

...ちょうど思考

Read this

+0

はい、SDLを使用しています。私はSDL_mainについて認識していますが、標準のSDL XCodeプロジェクトテンプレートをコンパイルしようとしましたが、デバッガは正常に動作しました。デバッガが動作しないのは私の「本当の」プロジェクトのちょうどのところです。また、私は最適化をオフにしているので、それはそれと関係しているとは思わない。 –

1

私はXCodeのSDL プロジェクトテンプレートをコンパイルしようとした 経験していない同じ問題が、それは は私 プロジェクトで特別な何かが原因である必要がありました。

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

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

プロジェクト設定に移動します。以下を設定してください

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

これを実行した後に問題が発生する必要があります。デバッグ情報をオブジェクトファイルにする必要がありますあなたの旗から

alt text http://i39.tinypic.com/sb6hb9.png

+0

ヒントのおかげで!最適化は既にオフになっていましたが、ゼロリンクと命令スケジューリングを無効にしました。残念ながらこれのどれもが何の違いもないようです。問題は同じままです。 –

0

:ここ は、プロジェクトの設定は、上の設定を変更する必要があり、その画面です。

プロジェクト設定によって実行可能ファイルが1か所に構築され、完了したら最終実行ファイルを別の場所に移動しますか?この場合、gdbはオブジェクトファイルを見つけられず、オブジェクトファイルからデバッグ情報を正しく取得できないことがあります。

まあまあです。

+1

私はこのようなことを知らない。また、これが問題の原因であった場合、私の実際のプロジェクトが基づいているバニラSDL XCodeテンプレートプロジェクトにも問題が表示されます。 –

0

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

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

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

「修正して続行」機能が正常に機能することはありませんでした。

+0

提案していただきありがとうございます。私はそれを試しましたが、残念ながらフラグを追加しても問題は解決しませんでした。 –

+0

投稿を更新して2つの他のフラグを削除するように提案しました... –

0

wxWidgetsのも、あなたはすべてのプログラムのようにhere

から自分IMPLEMENT_APP()マクロ

を使用する場合は、「メイン」機能が存在しなければならないmain自分自身を定義します。 wxWidgetsでは、このマクロを使用してmainが実装されます。このマクロは、アプリケーションインスタンスを作成し、プログラムを開始します。

IMPLEMENT_APP(MyApp)

0

私は今、ダウンロードしてコンパイルさFreeImageソースを、はい、ファイルb44ExpLogTable.cpplibfreeimage.aにコンパイルされてきた私の答えhere

を参照してください。問題は、スクリプトgensrclist.shのように、.cppのファイルをすべて収集します。このスクリプトでは、Makefile.srcsという名前のファイルが生成されますが、そのファイルはすでに提供されています。 (私のLeopard上でそれを実行するとshで、いくつかの問題を失敗しました - 私はbashshを変更した場合、それは働いていた)

あなたは、これがa.out

c++ libfreeimage.a 

ファイルMakefile.srcsがまだ作成されている与え、何も変更されています前に、ファイルb44ExpLogTable.cppを削除する必要があります。これが行われると、その後上記c++ libfreeimage.aは、私はあなたが試すことができ、新たなものを持って、次のエラーに

Undefined symbols: 
    "_main", referenced from: 
     start in crt1.10.5.o 
ld: symbol(s) not found 
collect2: ld returned 1 exit status 
0

make -f Makefile.osx clean 
make -f Makefile.osx 

与える必要があります。

ちょうどあなた自身のmain前に、あなたはmainを再定義し、いくつかのヘッダを持っている場合、これはエラーを与える必要があります

#ifdef main 
# error main is defined 
#endif 

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

を書くことができます。あなたは前の定義が

#define main foo 

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

とした警告を受けるかもしれない独自に定義した場合

また、単にあなたのmain

#undef main 

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

私が得たそれらの症状、前undefに試すことができますgdbのバージョンがg ++のバージョンと一致しませんでした。

最新のgdbを入手してください。

関連する問題