X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fdebug.h;h=ba2e8704ebd1cc7c892dcec67618c6009f75035a;hb=68bbdf1b2c1bc70f48d52694411cd7859d09c728;hp=1780025a333420868b83def1280ec645c20ee7a7;hpb=24c4b7c68d283a4d1de72a3eb68f1268f1fe34e3;p=minetest.git diff --git a/src/debug.h b/src/debug.h index 1780025a3..ba2e8704e 100644 --- a/src/debug.h +++ b/src/debug.h @@ -1,106 +1,63 @@ /* -(c) 2010 Perttu Ahola -*/ - -/* - Debug stuff +Minetest +Copyright (C) 2013 celeron55, Perttu Ahola + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef DEBUG_HEADER #define DEBUG_HEADER -#include -#include -#include #include -#include "common_irrlicht.h" - -/* - Compatibility stuff -*/ +#include +#include "gettime.h" #if (defined(WIN32) || defined(_WIN32_WCE)) -typedef DWORD threadid_t; -#define __NORETURN __declspec(noreturn) -#define __FUNCTION_NAME __FUNCTION__ + #define WIN32_LEAN_AND_MEAN + #ifndef _WIN32_WINNT + #define _WIN32_WINNT 0x0501 + #endif + #include + #ifdef _MSC_VER + #include + #endif + #define __NORETURN __declspec(noreturn) + #define __FUNCTION_NAME __FUNCTION__ #else -typedef pthread_t threadid_t; -#define __NORETURN __attribute__ ((__noreturn__)) -#define __FUNCTION_NAME __PRETTY_FUNCTION__ + #define __NORETURN __attribute__ ((__noreturn__)) + #define __FUNCTION_NAME __PRETTY_FUNCTION__ #endif -inline threadid_t get_current_thread_id() -{ -#if (defined(WIN32) || defined(_WIN32_WCE)) - return GetCurrentThreadId(); +// Whether to catch all std::exceptions. +// Assert will be called on such an event. +// In debug mode, leave these for the debugger and don't catch them. +#ifdef NDEBUG + #define CATCH_UNHANDLED_EXCEPTIONS 1 #else - return pthread_self(); + #define CATCH_UNHANDLED_EXCEPTIONS 0 #endif -} /* Debug output */ -#define DEBUGSTREAM_COUNT 2 - -extern FILE *g_debugstreams[DEBUGSTREAM_COUNT]; +#define DTIME (getTimestamp()+": ") extern void debugstreams_init(bool disable_stderr, const char *filename); extern void debugstreams_deinit(); -#define DEBUGPRINT(...)\ -{\ - for(int i=0; i +#undef assert + /* Assert */ @@ -138,23 +102,11 @@ __NORETURN extern void assert_fail( #define DEBUG_STACK_SIZE 50 #define DEBUG_STACK_TEXT_SIZE 300 -struct DebugStack -{ - DebugStack(threadid_t id); - void print(FILE *file, bool everything); - - threadid_t threadid; - char stack[DEBUG_STACK_SIZE][DEBUG_STACK_TEXT_SIZE]; - int stack_i; // Points to the lowest empty position - int stack_max_i; // Highest i that was seen -}; - -extern core::map g_debug_stacks; -extern JMutex g_debug_stacks_mutex; - extern void debug_stacks_init(); +extern void debug_stacks_print_to(std::ostream &os); extern void debug_stacks_print(); +struct DebugStack; class DebugStacker { public: @@ -166,63 +118,53 @@ class DebugStacker bool m_overflowed; }; -#define DSTACK(...)\ +#define DSTACK(msg)\ + DebugStacker __debug_stacker(msg); + +#define DSTACKF(...)\ char __buf[DEBUG_STACK_TEXT_SIZE];\ snprintf(__buf,\ DEBUG_STACK_TEXT_SIZE, __VA_ARGS__);\ DebugStacker __debug_stacker(__buf); /* - Packet counter + These should be put into every thread */ -class PacketCounter -{ -public: - PacketCounter() - { - } - - void add(u16 command) - { - core::map::Node *n = m_packets.find(command); - if(n == NULL) - { - m_packets[command] = 1; +#if CATCH_UNHANDLED_EXCEPTIONS == 1 + #define BEGIN_PORTABLE_DEBUG_EXCEPTION_HANDLER try{ + #define END_PORTABLE_DEBUG_EXCEPTION_HANDLER(logstream)\ + }catch(std::exception &e){\ + logstream<<"ERROR: An unhandled exception occurred: "\ + <setValue(n->getValue()+1); - } - } - - void clear() - { - for(core::map::Iterator - i = m_packets.getIterator(); - i.atEnd() == false; i++) - { - i.getNode()->setValue(0); - } - } - - void print(std::ostream &o) - { - for(core::map::Iterator - i = m_packets.getIterator(); - i.atEnd() == false; i++) - { - o<<"cmd "<getKey() - <<" count "<getValue() - < m_packets; -}; - + #ifdef _WIN32 // Windows + #ifdef _MSC_VER // MSVC +void se_trans_func(unsigned int, EXCEPTION_POINTERS*); + #define BEGIN_DEBUG_EXCEPTION_HANDLER \ + BEGIN_PORTABLE_DEBUG_EXCEPTION_HANDLER\ + _set_se_translator(se_trans_func); + + #define END_DEBUG_EXCEPTION_HANDLER(logstream) \ + END_PORTABLE_DEBUG_EXCEPTION_HANDLER(logstream) + #else // Probably mingw + #define BEGIN_DEBUG_EXCEPTION_HANDLER\ + BEGIN_PORTABLE_DEBUG_EXCEPTION_HANDLER + #define END_DEBUG_EXCEPTION_HANDLER(logstream)\ + END_PORTABLE_DEBUG_EXCEPTION_HANDLER(logstream) + #endif + #else // Posix + #define BEGIN_DEBUG_EXCEPTION_HANDLER\ + BEGIN_PORTABLE_DEBUG_EXCEPTION_HANDLER + #define END_DEBUG_EXCEPTION_HANDLER(logstream)\ + END_PORTABLE_DEBUG_EXCEPTION_HANDLER(logstream) + #endif +#else + // Dummy ones + #define BEGIN_DEBUG_EXCEPTION_HANDLER + #define END_DEBUG_EXCEPTION_HANDLER(logstream) +#endif #endif // DEBUG_HEADER