From 1d5e483b442885cf67f7ff6d1c505ec7b978e7e1 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Peter=20K=C3=BCmmel?= Date: Mon, 25 Apr 2011 09:14:50 +0000 Subject: [PATCH] move call stack code, add TODOs (only disabled code is touched) git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@38494 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/support/debug.cpp | 47 ------------------------------------- src/support/debug.h | 2 -- src/support/lassert.cpp | 52 +++++++++++++++++++++++++++++++++++++++++ src/support/lassert.h | 4 ++++ 4 files changed, 56 insertions(+), 49 deletions(-) diff --git a/src/support/debug.cpp b/src/support/debug.cpp index 21182b4b5b..29a167af91 100644 --- a/src/support/debug.cpp +++ b/src/support/debug.cpp @@ -22,16 +22,6 @@ #include #include -//#define LYX_CALLSTACK_PRINTING -// must be linked with -rdynamic -#ifdef LYX_CALLSTACK_PRINTING -#include -#include -#include -#include -#endif - - using namespace std; using namespace lyx::support; @@ -254,42 +244,5 @@ LyXErr & operator<<(LyXErr & l, ios_base &(*t)(ios_base &)) LyXErr lyxerr; -void Debug::printCallStack() -{ -#ifdef LYX_CALLSTACK_PRINTING - const int depth = 50; - - // get void*'s for all entries on the stack - void* array[depth]; - size_t size = backtrace(array, depth); - - char** messages = backtrace_symbols(array, size); - - for (size_t i = 0; i < size && messages != NULL; i++) { - std::string orig(messages[i]); - // extract mangled: bin/lyx2.0(_ZN3lyx7support7packageEv+0x32) [0x8a2e02b] - char* mangled = 0; - for (char *p = messages[i]; *p; ++p) { - if (*p == '(') { - *p = 0; - mangled = p + 1; - } else if (*p == '+') { - *p = 0; - break; - } - } - int err = 0; - char* demangled = abi::__cxa_demangle(mangled, 0, 0, &err); - if (err == 0) { - fprintf(stderr, "[bt]: (%d) %s %s\n", i, messages[i], demangled); - free((void*)demangled); - } else { - fprintf(stderr, "[bt]: (%d) %s\n", i, orig.c_str()); - } - - } -#endif -} - } // namespace lyx diff --git a/src/support/debug.h b/src/support/debug.h index 3835242b36..d636e4c5c3 100644 --- a/src/support/debug.h +++ b/src/support/debug.h @@ -124,8 +124,6 @@ namespace Debug { /// Show all the possible tags that can be used for debugging void showTags(std::ostream & os); - /// Print simple callstack to stderr - void printCallStack(); } // namespace Debug diff --git a/src/support/lassert.cpp b/src/support/lassert.cpp index b384007f60..9c0daff328 100644 --- a/src/support/lassert.cpp +++ b/src/support/lassert.cpp @@ -4,6 +4,7 @@ * Licence details can be found in the file COPYING. * * \author André Pönitz + * \author Peter Kümmel * * Full author contact details are available in file CREDITS. */ @@ -14,13 +15,64 @@ #include + +//#define LYX_CALLSTACK_PRINTING +// must be linked with -rdynamic +#ifdef LYX_CALLSTACK_PRINTING +#include +#include +#include +#include +#endif + + namespace lyx { void doAssert(char const * expr, char const * file, long line) { + // TODO Should we try to print the call stack before exiting? + LYXERR0("ASSERTION " << expr << " VIOLATED IN " << file << ":" << line); // comment this out if not needed BOOST_ASSERT(false); } + +//TODO Return as string, so call stack could be used in dialogs. +void printCallStack() +{ +#ifdef LYX_CALLSTACK_PRINTING + const int depth = 50; + + // get void*'s for all entries on the stack + void* array[depth]; + size_t size = backtrace(array, depth); + + char** messages = backtrace_symbols(array, size); + + for (size_t i = 0; i < size && messages != NULL; i++) { + std::string orig(messages[i]); + // extract mangled: bin/lyx2.0(_ZN3lyx7support7packageEv+0x32) [0x8a2e02b] + char* mangled = 0; + for (char *p = messages[i]; *p; ++p) { + if (*p == '(') { + *p = 0; + mangled = p + 1; + } else if (*p == '+') { + *p = 0; + break; + } + } + int err = 0; + char* demangled = abi::__cxa_demangle(mangled, 0, 0, &err); + if (err == 0) { + fprintf(stderr, "[bt]: (%d) %s %s\n", i, messages[i], demangled); + free((void*)demangled); + } else { + fprintf(stderr, "[bt]: (%d) %s\n", i, orig.c_str()); + } + } +#endif +} + } // namespace lyx diff --git a/src/support/lassert.h b/src/support/lassert.h index 60ee570fa3..66d73cefbf 100644 --- a/src/support/lassert.h +++ b/src/support/lassert.h @@ -18,6 +18,10 @@ namespace lyx { void doAssert(char const * expr, char const * file, long line); +/// Print demangled callstack to stderr +void printCallStack(); + + } // namespace lyx #define LASSERT(expr, escape) \ -- 2.39.2