From e10639753d7dbd368f5edc2555d75c4b5905ba3b Mon Sep 17 00:00:00 2001 From: Pixel Date: Mon, 21 Nov 2011 13:27:53 -0800 Subject: GeneralException() will now trace the callstack and store this, for debugging purposes. --- includes/Exceptions.h | 11 ++++++++--- includes/HttpServer.h | 2 +- includes/Main.h | 3 +++ 3 files changed, 12 insertions(+), 4 deletions(-) (limited to 'includes') diff --git a/includes/Exceptions.h b/includes/Exceptions.h index 0563090..c397265 100644 --- a/includes/Exceptions.h +++ b/includes/Exceptions.h @@ -3,22 +3,27 @@ #include #include #include +#include namespace Balau { class GeneralException { public: - GeneralException(const char * msg) : m_msg(::strdup(msg)) { } - GeneralException(const String & msg) : m_msg(msg.strdup()) { } - GeneralException(const GeneralException & e) : m_msg(strdup(e.m_msg)) { } + GeneralException(const char * msg) : m_msg(::strdup(msg)) { genTrace(); } + GeneralException(const String & msg) : m_msg(msg.strdup()) { genTrace(); } + GeneralException(const GeneralException & e) : m_msg(strdup(e.m_msg)), m_trace(e.m_trace) { } ~GeneralException() { if (m_msg) free(m_msg); } const char * getMsg() const { return m_msg; } + const std::vector getTrace() const { return m_trace; } protected: GeneralException() : m_msg(0) { } void setMsg(char * msg) { if (m_msg) free(m_msg); m_msg = msg; } + void genTrace(); + private: char * m_msg; + std::vector m_trace; }; static inline void * malloc(size_t size) throw (GeneralException) { diff --git a/includes/HttpServer.h b/includes/HttpServer.h index f78a816..51c119c 100644 --- a/includes/HttpServer.h +++ b/includes/HttpServer.h @@ -27,7 +27,7 @@ class HttpServer { void unref() { if (Atomic::Decrement(&m_refCount) == 0) delete this; } void ref() { Atomic::Increment(&m_refCount); } void registerMe(HttpServer * server) { server->registerAction(this); } - virtual bool Do(HttpServer * server, Http::Request & req, ActionMatch & match, IO out) = 0; + virtual bool Do(HttpServer * server, Http::Request & req, ActionMatch & match, IO out) throw (GeneralException) = 0; private: Regex m_regex, m_host; volatile int m_refCount; diff --git a/includes/Main.h b/includes/Main.h index 5fa64c1..1c902ec 100644 --- a/includes/Main.h +++ b/includes/Main.h @@ -88,6 +88,9 @@ class Main { catch (GeneralException e) { m_status = STOPPING; Printer::log(M_ERROR | M_ALERT, "The application caused an exception: %s", e.getMsg()); + std::vector trace = e.getTrace(); + for (std::vector::iterator i = trace.begin(); i != trace.end(); i++) + Printer::log(M_DEBUG, "%s", i->to_charp()); r = -1; } catch (...) { -- cgit v1.2.3