diff options
-rw-r--r-- | src/utils/checkutils.cpp | 34 | ||||
-rw-r--r-- | src/utils/checkutils.h | 6 |
2 files changed, 40 insertions, 0 deletions
diff --git a/src/utils/checkutils.cpp b/src/utils/checkutils.cpp index 8aa82bc11..2fc471d7e 100644 --- a/src/utils/checkutils.cpp +++ b/src/utils/checkutils.cpp @@ -24,6 +24,10 @@ #include "logger.h" +#if defined __linux__ || defined __linux +#include <execinfo.h> +#endif // defined __linux__ || defined __linux + #include "debug.h" bool reportFalseReal(const bool val, const char *const file, @@ -42,4 +46,34 @@ bool reportTrueReal(const bool val, const char *const file, return val; } +void reportStack(const char *const file, + const unsigned int line, + const char *const func, + const char *const name, + const char *const text) +{ +#if defined __linux__ || defined __linux + void *array[15]; + int size; + char **strings; + int i; +#endif // defined __linux__ || defined __linux + + logger->log("--- %s --------------------------------------------", + name); + logger->log("%s:%u: '%s' in function `%s'", + file, + line, + text, + func); +#if defined __linux__ || defined __linux + size = (int)backtrace(array, 15); + strings = backtrace_symbols(array, size); + for (i = 0; i < size; i++) + logger->log1(strings[i]); + free(strings); +#endif // defined __linux__ || defined __linux + +} + #endif // ENABLE_ASSERTS diff --git a/src/utils/checkutils.h b/src/utils/checkutils.h index ce4fcdc61..21f439743 100644 --- a/src/utils/checkutils.h +++ b/src/utils/checkutils.h @@ -35,6 +35,12 @@ bool reportFalseReal(const bool val, const char *const file, bool reportTrueReal(const bool val, const char *const file, const unsigned line); +void reportStack(const char *const file, + const unsigned int line, + const char *const func, + const char *const name, + const char *const text); + #else // ENABLE_ASSERTS #define reportFalse(val) (val) |