2012-04-01 3 views
0

Ich mache einige C++ - Programmierung unter Mac OS X Lion und möchte Stack-Trace bei Absturz oder Ausnahme ausdrucken. In der folgenden Diskussion habe ich sowohl MacPorts gcc47 als auch apples llvm-gcc42 ausprobiert.Backtracing bei nicht abgefangener Ausnahme unter Mac OSX

Ich kam, um glog zu verwenden, weil es hübsche Stapelspur druckt. Es sieht gut die Drucke die folgende Stack-Trace, wenn ich das Programm zum Absturz, durch einen Null-Zeiger zugreifen:

*** 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 

Allerdings, wenn ich das Programm abgestürzt durch Auslösen einer Ausnahme, die Stack-Trace ausgedruckt ist nicht sehr nützlich:

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 

versuchte ich das Samething auf einem System CentOS und druckt es mit abgefangene Ausnahmen vernünftigen Stack-Trace aus, so sollte es kein Problem des glog sein.

Also meine Frage ist: gibt es eine Möglichkeit, Glog drucken den Stack-Trace für nicht abgefangene Ausnahmen drucken lassen?

+0

Dies ist keine Antwort auf Glog arbeiten, aber Sie könnten DTrace, die auch geben können, was Sie wollen. Es besteht keine Notwendigkeit, etwas in ein Programm zu kompilieren oder für das Debug zu kompilieren. Es kann für bestehende Programme verwendet werden. einige Referenzen: [Oracle/Sun DTrace] (http://docs.oracle.com/cd/E19253-01/817-6223/chp-actsub-ustack/index.html) und [MacTech DTrace] (http: // www.mactech.com/articles/mactech/Vol.23/23.11/ExploringLeopardwithDTrace/index.html) es gibt mehrere Seiten von "DTrace one Liner" im Web, die Sie wollen können Sie wollen (mit Ustack). Es ist sehr nützlich. – gbulmer

+0

Der Vollständigkeit halber hat das OP dies offenbar als Fehler bei google-glog [hier] (http://code.google.com/p/google-glog/issues/detail?id=120) abgelegt. Hoffentlich wird jemand von Google die Frage direkt ansprechen. – MrGomez

+0

@MrGomez, ich war es, der auf das Google-Glog-Problem eingefügt hat. –

Antwort

0

Kurz gesagt, versuchen Sie libunwind installieren und Google-Glog neu erstellen, um zu sehen, ob dies Ihr Problem behebt. Diese Abhängigkeit scheint zum Zeitpunkt dieses Schreibens von the OSX SDK gegeben zu sein.

Von stacktrace.cc (zog später nach 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(). 

Und in der zweiten Datei:

#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 

mit libunwind Wiederaufbau zur Verfügung sollte Vorrang vor Ihrer Stack-Traces nehmen lassen. Wenn das Problem dadurch nicht gelöst wird, sollten die Programmierer, die hinter beiden Tools stehen, informiert werden.

+0

Ich habe das versucht, aber scheint wie das Erstellen der Open-Source-libunwind ist derzeit schwierig auf MacOSX, weil die Open-Source-Version nur auf Elf funktioniert, nicht die Mach-O. Ich muss möglicherweise viel Code in libunwind ändern, wenn ich es auf MacOSX erstellen möchte. Auf der anderen Seite bietet MacOSX eine libunwind unter/usr/lib/system/libunwind.Dylib, aber ich habe keine Ahnung, wie es von Google-Glog verwendet werden kann, denn ein kleines Testprogramm sagt '' ld: kann nicht direkt mit /usr/lib/system/libunwind.dylib verlinken. Verknüpfen Sie stattdessen mit dem Rahmenwerk "System.framework". für Architektur x86_64 '' –

+0

siehe diesen Beitrag, als Referenz: http://lists.gnu.org/archive/html/libunwind-devel/2010-03/msg00000.html –

+0

@icando Sie sind richtig, Vanille libunwind explodiert heftig wenn Sie versuchen, es in ein x86_64 Mach-O zu kompilieren. Allerdings stelle ich fest, dass Apple [diese Quelle für libunwind] (http://www.opensource.apple.com/source/libunwind/) ([download link] (http://www.opensource.apple.com/tarballs/) zur Verfügung stellt. libunwind/libunwind-30.tar.gz)), die Mach-O-Unterstützung zu haben scheinen und [Fehler in GCC beheben] (http://www.opensource.apple.com/source/libunwind/libunwind-30/include/ abwickeln.h). Ich werde es hier drehen, um zu sehen, ob es auf meinem iMac funktioniert. Wenn dies der Fall ist, werde ich meine Antwort aktualisieren. – MrGomez

0

Ab OS X 10.6, hat die NSException Klasse eine -callStackSymbols und eine -callStackReturnAddresses Methode, die lassen sollten Sie den Stapel Spur abrufen, wie es zu der Zeit die Ausnahme ausgelöst wurde, war. Wenn Sie denselben Mechanismus für Nicht-Ausnahmefehler verwenden möchten, sehen Sie sich in der Apple-Dokumentation Controlling a Program’s Response to Exceptions an. Ich habe das mit C++ - Ausnahmen nicht versucht, aber die Dokumente behaupten, dass zumindest in der 64-Bit-Laufzeit Objective-C- und C++ - Ausnahmen interoperabel sind, also ist es zumindest einen Versuch wert.

Verwandte Themen