X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fdebug.h;h=2098942db7ec17e457fa72fb8e88d50f5e3c9d40;hb=9762650f978cc7bae78861b70a051b26cc5e2dc6;hp=ba2e8704ebd1cc7c892dcec67618c6009f75035a;hpb=c6e3797c1a2ed45ab72704ce434d15e65930f595;p=minetest.git diff --git a/src/debug.h b/src/debug.h index ba2e8704e..2098942db 100644 --- a/src/debug.h +++ b/src/debug.h @@ -22,7 +22,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include +#include #include "gettime.h" +#include "log.h" #if (defined(WIN32) || defined(_WIN32_WCE)) #define WIN32_LEAN_AND_MEAN @@ -33,15 +35,15 @@ with this program; if not, write to the Free Software Foundation, Inc., #ifdef _MSC_VER #include #endif - #define __NORETURN __declspec(noreturn) - #define __FUNCTION_NAME __FUNCTION__ + #define NORETURN __declspec(noreturn) + #define FUNCTION_NAME __FUNCTION__ #else - #define __NORETURN __attribute__ ((__noreturn__)) - #define __FUNCTION_NAME __PRETTY_FUNCTION__ + #define NORETURN __attribute__ ((__noreturn__)) + #define FUNCTION_NAME __PRETTY_FUNCTION__ #endif // Whether to catch all std::exceptions. -// Assert will be called on such an event. +// When "catching", the program will abort with an error message. // In debug mode, leave these for the debugger and don't catch them. #ifdef NDEBUG #define CATCH_UNHANDLED_EXCEPTIONS 1 @@ -49,51 +51,39 @@ with this program; if not, write to the Free Software Foundation, Inc., #define CATCH_UNHANDLED_EXCEPTIONS 0 #endif -/* - Debug output -*/ - -#define DTIME (getTimestamp()+": ") - -extern void debugstreams_init(bool disable_stderr, const char *filename); -extern void debugstreams_deinit(); - -// This is used to redirect output to /dev/null -class Nullstream : public std::ostream { -public: - Nullstream(): - std::ostream(0) - { - } -private: -}; - -extern std::ostream dstream; -extern std::ostream dstream_no_stderr; -extern Nullstream dummyout; +/* Abort program execution immediately + */ +NORETURN extern void fatal_error_fn( + const char *msg, const char *file, + unsigned int line, const char *function); -/* - Include assert.h and immediately undef assert so that it can't override - our assert later on. leveldb/slice.h is a notable offender. -*/ +#define FATAL_ERROR(msg) \ + fatal_error_fn((msg), __FILE__, __LINE__, FUNCTION_NAME) -#include -#undef assert +#define FATAL_ERROR_IF(expr, msg) \ + ((expr) \ + ? fatal_error_fn((msg), __FILE__, __LINE__, FUNCTION_NAME) \ + : (void)(0)) /* - Assert + sanity_check() + Equivalent to assert() but persists in Release builds (i.e. when NDEBUG is + defined) */ -__NORETURN extern void assert_fail( +NORETURN extern void sanity_check_fn( const char *assertion, const char *file, unsigned int line, const char *function); -#define ASSERT(expr)\ - ((expr)\ - ? (void)(0)\ - : assert_fail(#expr, __FILE__, __LINE__, __FUNCTION_NAME)) +#define SANITY_CHECK(expr) \ + ((expr) \ + ? (void)(0) \ + : sanity_check_fn(#expr, __FILE__, __LINE__, FUNCTION_NAME)) + +#define sanity_check(expr) SANITY_CHECK(expr) -#define assert(expr) ASSERT(expr) + +void debug_set_exception_handler(); /* DebugStack @@ -118,13 +108,12 @@ class DebugStacker bool m_overflowed; }; -#define DSTACK(msg)\ +#define DSTACK(msg) \ DebugStacker __debug_stacker(msg); -#define DSTACKF(...)\ - char __buf[DEBUG_STACK_TEXT_SIZE];\ - snprintf(__buf,\ - DEBUG_STACK_TEXT_SIZE, __VA_ARGS__);\ +#define DSTACKF(...) \ + char __buf[DEBUG_STACK_TEXT_SIZE]; \ + snprintf(__buf, DEBUG_STACK_TEXT_SIZE, __VA_ARGS__); \ DebugStacker __debug_stacker(__buf); /* @@ -132,38 +121,17 @@ class DebugStacker */ #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: "\ - <