2004-08-28 16:21:25 +00:00
|
|
|
/** @file
|
|
|
|
|
|
|
|
$Id$
|
|
|
|
|
|
|
|
$Date$
|
|
|
|
$Author$
|
|
|
|
|
|
|
|
@copy © Marc Wäckerlin
|
|
|
|
@license LGPL, see file <a href="license.html">COPYING</a>
|
|
|
|
|
|
|
|
$Log$
|
|
|
|
Revision 1.2 2004/08/28 16:21:25 marc
|
|
|
|
mrw-c++-0.92 (mrw)
|
|
|
|
- new file: version.cpp
|
|
|
|
- new file header for all sources
|
|
|
|
- work around warning in mrw::auto<T>
|
|
|
|
- possibility to compile without log4cxx
|
|
|
|
- work around bugs in demangle.h and libiberty.h
|
|
|
|
- corrections in documentation
|
|
|
|
- added simple tracing mechanism
|
|
|
|
- more warnings
|
|
|
|
- small corrections in Auto<>::Free and a new test for it
|
|
|
|
- possibility to compile without stack trace
|
|
|
|
|
|
|
|
*/
|
2004-04-23 16:03:29 +00:00
|
|
|
#include <mrw/stacktrace.hpp>
|
|
|
|
#include <mrw/exception.hpp>
|
|
|
|
#include <exception>
|
|
|
|
#include <log4cxx/logger.h>
|
|
|
|
|
|
|
|
namespace mrw {
|
|
|
|
|
|
|
|
/** @addtogroup StackTrace */
|
|
|
|
//@{
|
|
|
|
|
|
|
|
/** @addtogroup AutoTrace
|
|
|
|
|
|
|
|
@section trclog4cxx Trace using the log4cxx Library
|
|
|
|
|
|
|
|
If you link to the library @c libmrwexclog4cxx using a linker
|
|
|
|
option such as: @c -lmrwexclog4cxx, then an unexpected handler
|
|
|
|
is registered, that traces a fatal error using the log4cxx
|
|
|
|
library. You don't need to change a single line in your code!
|
|
|
|
|
|
|
|
The log4cxx library is located at:
|
|
|
|
- http://logging.apache.org/log4cxx
|
|
|
|
|
|
|
|
@note The configurator is not installed automatically. If you
|
|
|
|
want to trace e.g. on the console, you have to call @c
|
|
|
|
log4cxx::BasicConfigurator::configure(); as first statement in
|
|
|
|
your @c main().
|
|
|
|
*/
|
|
|
|
//@{
|
|
|
|
|
|
|
|
/** @brief unexpected handler, that traces using log4cxx
|
|
|
|
|
|
|
|
The unexpected handler is installed automatically when you link
|
|
|
|
to @c -lmrwexclog4cxx. The implementation of this unexpected
|
|
|
|
handler is as follows:
|
|
|
|
|
|
|
|
@code
|
|
|
|
void unexpected_log4cxx() {
|
2004-08-28 16:21:25 +00:00
|
|
|
log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(_T("libmrw"));
|
2004-04-23 16:03:29 +00:00
|
|
|
logger->fatal("Unexpected Exception", __FILE__, __LINE__);
|
2004-08-28 16:21:25 +00:00
|
|
|
StackTrace::createSymtable();
|
|
|
|
std::string st((std::string)StackTrace());
|
2004-04-23 16:03:29 +00:00
|
|
|
try {
|
|
|
|
throw;
|
|
|
|
} catch (const mrw::exception& x) {
|
|
|
|
logger->fatal(std::string("Reason:\n")+x.what()
|
2004-08-28 16:21:25 +00:00
|
|
|
+"\nStack:+\n"+x.stacktrace());
|
2004-04-23 16:03:29 +00:00
|
|
|
} catch (const std::exception& x) {
|
|
|
|
logger->fatal(std::string("Reason:\n")+x.what()
|
2004-08-28 16:21:25 +00:00
|
|
|
+"\nStack:\n"+st);
|
2004-04-23 16:03:29 +00:00
|
|
|
} catch (...) {
|
2004-08-28 16:21:25 +00:00
|
|
|
logger->fatal(std::string("Reason: **** not available ****")
|
|
|
|
+"\nStack:\n"+st);
|
2004-04-23 16:03:29 +00:00
|
|
|
}
|
|
|
|
throw std::bad_exception();
|
|
|
|
}
|
|
|
|
@endcode
|
|
|
|
|
|
|
|
*/
|
|
|
|
void unexpected_log4cxx() {
|
2004-08-28 16:21:25 +00:00
|
|
|
log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(_T("libmrw"));
|
2004-04-23 16:03:29 +00:00
|
|
|
logger->fatal("Unexpected Exception", __FILE__, __LINE__);
|
2004-08-28 16:21:25 +00:00
|
|
|
StackTrace::createSymtable();
|
|
|
|
std::string st((std::string)StackTrace());
|
2004-04-23 16:03:29 +00:00
|
|
|
try {
|
|
|
|
throw;
|
|
|
|
} catch (const mrw::exception& x) {
|
|
|
|
logger->fatal(std::string("Reason:\n")+x.what()
|
2004-08-28 16:21:25 +00:00
|
|
|
+"\nStack:+\n"+x.stacktrace());
|
2004-04-23 16:03:29 +00:00
|
|
|
} catch (const std::exception& x) {
|
|
|
|
logger->fatal(std::string("Reason:\n")+x.what()
|
2004-08-28 16:21:25 +00:00
|
|
|
+"\nStack:\n"+st);
|
2004-04-23 16:03:29 +00:00
|
|
|
} catch (...) {
|
2004-08-28 16:21:25 +00:00
|
|
|
logger->fatal(std::string("Reason: **** not available ****")
|
|
|
|
+"\nStack:\n"+st);
|
2004-04-23 16:03:29 +00:00
|
|
|
}
|
|
|
|
throw std::bad_exception();
|
|
|
|
}
|
|
|
|
|
|
|
|
//@}
|
|
|
|
//@}
|
|
|
|
|
|
|
|
class AutoStackTrace {
|
|
|
|
public:
|
|
|
|
AutoStackTrace() {
|
|
|
|
std::set_unexpected(&mrw::unexpected_log4cxx);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
// initialize stack traces (load symbols)
|
|
|
|
static AutoStackTrace _autoStackTrace;
|
|
|
|
|
|
|
|
}
|