2012-04-01 4 views
0

Mac OSX LionでいくつかのC++プログラミングを行い、クラッシュまたは例外が発生したときにスタックトレースを出力したい。以下の説明では、MacPortのgcc47とappleのllvm-gcc42の両方を試しました。Mac OSXでキャッチされない例外のバックトレース

きれいなスタックトレースを印刷するので、glogを使用するようになりました。私は例外をスローすることにより、プログラムをクラッシュした場合、しかし、

*** Aborted at 1333289352 (unix time) try "date -d @1333289352" if you are using GNU date *** 
PC: @  0x1091a9137 C::h() 
*** SIGSEGV (@0x0) received by PID 29623 (TID 0x7fff722d4960) stack trace: *** 
    @  0x7fff8cabdcfa _sigtramp 
    @  0x1091a9138 C::h() 
    @  0x1091a9112 C::g() 
    @  0x1091a90ef C::f() 
    @  0x1091a903a main 
Segmentation fault: 11 

、プリントアウトスタックトレースは非常に有用ではありません。私はNULLポインタにアクセスすることでプログラムのクラッシュを聞かせている場合には、プリント次のスタックトレース罰金になります。

terminate called after throwing an instance of 'std::runtime_error' 
    what(): Haha 
*** Aborted at 1333289406 (unix time) try "date -d @1333289406" if you are using GNU date *** 
PC: @  0x7fff8450f82a __kill 
*** SIGABRT (@0x7fff8450f82a) received by PID 52106 (TID 0x7fff722d4960) stack trace: *** 
    @  0x7fff8cabdcfa _sigtramp 
Abort trap: 6 

私はCentOSのシステム上samethingを試してみましたが、それがキャッチされない例外を除いて、合理的なスタックトレースを出力しますので、glogの問題になることはありません。

だから私の質問です:捕獲されない例外のスタックトレースをglogプリントアウトする方法はありますか?

+0

これはグロッグの仕事をするための答えではありませんが、あなたが望むものを与えるかもしれないDTraceも考えてください。プログラムに何かをコンパイルしたり、デバッグのためにコンパイルする必要はありません。既存のプログラムで使用できます。いくつかの参考文献:[Oracle/Sun DTrace](http://docs.oracle.com/cd/E19253-01/817-6223/chp-actsub-ustack/index.html)および[MacTech DTrace](http:// www.mactech.com/articles/mactech/Vol.23/23.11/ExploringLeopardwithDTrace/index.html)Web上に「DTrace 1ライナー」といういくつかのページがあり、あなたが望む(ustackを使用して)ほしいと思うかもしれません。非常に便利です。 – gbulmer

+0

完全性のために、OPはこれをgoogle-glog [here](http://code.google.com/p/google-glog/issues/detail?id=120)のバグとして提出したようです。うまくいけば、Googleの誰かが直接質問に対処します。 – MrGomez

+0

@MrGomez、それはグーグルグログの問題に貼り付けられた私でした。 –

答えて

0

簡潔に:libunwindをインストールし、google-glogを再構築して問題が解決するかどうかを確認してください。この依存関係は、この執筆時点でthe OSX SDKによって与えられているように見えます。 stacktrace.ccから

(後でutilities.hに移動):

// There are three different ways we can try to get the stack trace: 
// 
// 1) Our hand-coded stack-unwinder. This depends on a certain stack 
// layout, which is used by gcc (and those systems using a 
// gcc-compatible ABI) on x86 systems, at least since gcc 2.95. 
// It uses the frame pointer to do its work. 
// 
// 2) The libunwind library. This is still in development, and as a 
// separate library adds a new dependency, abut doesn't need a frame 
// pointer. It also doesn't call malloc. 
// 
// 3) The gdb unwinder -- also the one used by the c++ exception code. 
// It's obviously well-tested, but has a fatal flaw: it can call 
// malloc() from the unwinder. This is a problem because we're 
// trying to use the unwinder to instrument malloc(). 

そして後者のファイルで:利用可能libunwindのに再構築

#if defined(HAVE_LIB_UNWIND) 
# define STACKTRACE_H "stacktrace_libunwind-inl.h" 
#elif !defined(NO_FRAME_POINTER) 
# if defined(__i386__) && __GNUC__ >= 2 
# define STACKTRACE_H "stacktrace_x86-inl.h" 
# elif defined(__x86_64__) && __GNUC__ >= 2 
# define STACKTRACE_H "stacktrace_x86_64-inl.h" 
# elif (defined(__ppc__) || defined(__PPC__)) && __GNUC__ >= 2 
# define STACKTRACE_H "stacktrace_powerpc-inl.h" 
# endif 
#endif 

#if !defined(STACKTRACE_H) && defined(HAVE_EXECINFO_H) 
# define STACKTRACE_H "stacktrace_generic-inl.h" 
#endif 

#if defined(STACKTRACE_H) 
# define HAVE_STACKTRACE 
#endif 

は、それがあなたのスタックトレースよりも優先できるようにする必要があります。これで問題が解決しない場合は、両方のツールの背後にあるプログラマーに通知する必要があります。

+0

私はそれを試みましたが、オープンソースのビルドのようですlibunwindはMacOSXでは今は難しいです。オープンソースのバージョンはMach-Oではなくelfでしか動作しないからです。 MacOSXでビルドをしたいのであれば、libunwindの多くのコードを修正しなければならないかもしれません。 一方、MacOSXは/ usr/lib/system/libunwindにlibunwindを提供しています。ld:/usr/lib/system/libunwind.dylibと直接リンクすることはできませんので、google-glogでどのように使うことができるのか分かりません。代わりに傘のフレームワーク 'System.framework'にリンクしてください。アーキテクチャx86_64のために ' –

+0

参照のために、このポストを参照してください:http://lists.gnu.org/archive/html/libunwind-devel/2010-03/msg00000.html –

+0

あなたは正しい、バニラlibunwindは激しく爆発するそれをx86_64 Mach-Oにコンパイルしようとしたとき。しかし、私はAppleが[libunwindのこのソース](http://www.opensource.apple.com/source/libunwind/)([ダウンロードリンク](http://www.opensource.apple.com/tarballs/) libunwind/libunwind-30.tar.gz))、これはMach-OサポートとGCCのバグを修正したようです(http://www.opensource.apple.com/source/libunwind/libunwind-30/include/ unwind.h)。私はそれが私のiMacで動作するかどうかを見るためにここにスピンを与えるつもりです。私の答えが更新されます。 – MrGomez

0

OS X 10.6では、NSExceptionクラスには、例外がスローされた時点のスタックトラックを取得できるようにする-callStackSymbols-callStackReturnAddressesメソッドがあります。例外ではないエラーに同じメカニズムを使用する場合は、AppleのドキュメントのControlling a Program’s Response to Exceptionsをご覧ください。私はこれをC++の例外で試してみませんでしたが、少なくとも64ビットのランタイムでObjective-CとC++の例外は相互運用性があると主張しています。

関連する問題