aboutsummaryrefslogtreecommitdiff
path: root/src/common/Debugging
diff options
context:
space:
mode:
authorGiacomo Pozzoni <giacomopoz@gmail.com>2018-12-14 22:01:16 +0100
committerShauren <shauren.trinity@gmail.com>2021-11-16 20:36:58 +0100
commitd5c41d23e67e3813adf09ee84afa636b2192c891 (patch)
tree865a196a5dacfdf75aead0bf48afdd9c808515c6 /src/common/Debugging
parentaea3022e8974d2520bdd2427b1c83aa5cfbb1254 (diff)
Core/Misc: Log more information in asserts (#22783)
* Core/Misc: Log more information in asserts Add a new function GetDebugInfos() to types that could trigger an ASSERT() to easily include more useful information in crashlogs. This is an initial commit that requires many more commits to implement the new GetDebugInfos() function in all required types. If the type doesn't have the function, the global default one is picked which doesn't log anything. * Core/Misc: Fix dynamic build Add missing attribute for dynamic build * Core/Misc: Fix gcc/clang build * Core/Misc: Rename GetDebugInfos() to GetDebugInfo() * Core/Misc: Fix FormatAssertionMessage() adding an extra '\0' * Core/Misc: Add GetDebugInfo support to Unit * Core/Misc: Add GetDebugInfo support to Creature * Core/Misc: Add more info to GetDebugInfo for Creature * Core/Misc: Add GetDebugInfo support to GameObject * Core/Misc: Add GetDebugInfo support to Player * Core/Misc: Add more GetDebugInfo info * Core/Misc: Add GetDebugInfo support to Item * Core/Misc: Add GetDebugInfo support to Bag * Core/Misc: Add GetDebugInfo support to Transport * Core/Misc: Add GetDebugInfo support to TempSummon, Minion, Guardian, Pet * Core/Misc: Add GetDebugInfo support to Map, InstanceMap * Core/Misc: Add GetDebugInfo support to Spell * Core/Misc: Fix build warning * Core/Misc: Add GetDebugInfo support to Aura * Core/Misc: Add GetDebugInfo support to UnitAI (cherry picked from commit 9a924fb9d557434c5a2e4020c80db6e6bfe466ad)
Diffstat (limited to 'src/common/Debugging')
-rw-r--r--src/common/Debugging/Errors.cpp17
-rw-r--r--src/common/Debugging/Errors.h12
2 files changed, 20 insertions, 9 deletions
diff --git a/src/common/Debugging/Errors.cpp b/src/common/Debugging/Errors.cpp
index 9f832caff4d..7ad137715da 100644
--- a/src/common/Debugging/Errors.cpp
+++ b/src/common/Debugging/Errors.cpp
@@ -58,8 +58,8 @@ namespace
int32 length = vsnprintf(nullptr, 0, format, len);
va_end(len);
- formatted.resize(length + 1);
- vsnprintf(&formatted[0], length + 1, format, args);
+ formatted.resize(length);
+ vsnprintf(&formatted[0], length, format, args);
return formatted;
}
@@ -68,20 +68,20 @@ namespace
namespace Trinity
{
-void Assert(char const* file, int line, char const* function, char const* message)
+void Assert(char const* file, int line, char const* function, std::string debugInfo, char const* message)
{
- std::string formattedMessage = StringFormat("\n%s:%i in %s ASSERTION FAILED:\n %s\n", file, line, function, message);
+ std::string formattedMessage = StringFormat("\n%s:%i in %s ASSERTION FAILED:\n %s\n", file, line, function, message) + debugInfo + '\n';
fprintf(stderr, "%s", formattedMessage.c_str());
fflush(stderr);
Crash(formattedMessage.c_str());
}
-void Assert(char const* file, int line, char const* function, char const* message, char const* format, ...)
+void Assert(char const* file, int line, char const* function, std::string debugInfo, char const* message, char const* format, ...)
{
va_list args;
va_start(args, format);
- std::string formattedMessage = StringFormat("\n%s:%i in %s ASSERTION FAILED:\n %s\n", file, line, function, message) + FormatAssertionMessage(format, args) + '\n';
+ std::string formattedMessage = StringFormat("\n%s:%i in %s ASSERTION FAILED:\n %s\n", file, line, function, message) + FormatAssertionMessage(format, args) + '\n' + debugInfo + '\n';
va_end(args);
fprintf(stderr, "%s", formattedMessage.c_str());
@@ -137,3 +137,8 @@ void AbortHandler(int sigval)
}
} // namespace Trinity
+
+std::string GetDebugInfo()
+{
+ return "";
+}
diff --git a/src/common/Debugging/Errors.h b/src/common/Debugging/Errors.h
index f64bff72fd1..befb269a120 100644
--- a/src/common/Debugging/Errors.h
+++ b/src/common/Debugging/Errors.h
@@ -19,11 +19,12 @@
#define TRINITYCORE_ERRORS_H
#include "Define.h"
+#include <string>
namespace Trinity
{
- DECLSPEC_NORETURN TC_COMMON_API void Assert(char const* file, int line, char const* function, char const* message) ATTR_NORETURN;
- DECLSPEC_NORETURN TC_COMMON_API void Assert(char const* file, int line, char const* function, char const* message, char const* format, ...) ATTR_NORETURN ATTR_PRINTF(5, 6);
+ DECLSPEC_NORETURN TC_COMMON_API void Assert(char const* file, int line, char const* function, std::string debugInfo, char const* message) ATTR_NORETURN;
+ DECLSPEC_NORETURN TC_COMMON_API void Assert(char const* file, int line, char const* function, std::string debugInfo, char const* message, char const* format, ...) ATTR_NORETURN ATTR_PRINTF(6, 7);
DECLSPEC_NORETURN TC_COMMON_API void Fatal(char const* file, int line, char const* function, char const* message, ...) ATTR_NORETURN ATTR_PRINTF(4, 5);
@@ -37,6 +38,8 @@ namespace Trinity
} // namespace Trinity
+TC_COMMON_API std::string GetDebugInfo();
+
#if TRINITY_COMPILER == TRINITY_COMPILER_MICROSOFT
#define ASSERT_BEGIN __pragma(warning(push)) __pragma(warning(disable: 4127))
#define ASSERT_END __pragma(warning(pop))
@@ -49,7 +52,8 @@ namespace Trinity
#define EXCEPTION_ASSERTION_FAILURE 0xC0000420L
#endif
-#define WPAssert(cond, ...) ASSERT_BEGIN do { if (!(cond)) Trinity::Assert(__FILE__, __LINE__, __FUNCTION__, #cond, ##__VA_ARGS__); } while(0) ASSERT_END
+#define WPAssert(cond, ...) ASSERT_BEGIN do { if (!(cond)) Trinity::Assert(__FILE__, __LINE__, __FUNCTION__, GetDebugInfo(), #cond, ##__VA_ARGS__); } while(0) ASSERT_END
+#define WPAssert_NODEBUGINFO(cond, ...) ASSERT_BEGIN do { if (!(cond)) Trinity::Assert(__FILE__, __LINE__, __FUNCTION__, "", #cond, ##__VA_ARGS__); } while(0) ASSERT_END
#define WPFatal(cond, ...) ASSERT_BEGIN do { if (!(cond)) Trinity::Fatal(__FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); } while(0) ASSERT_END
#define WPError(cond, msg) ASSERT_BEGIN do { if (!(cond)) Trinity::Error(__FILE__, __LINE__, __FUNCTION__, (msg)); } while(0) ASSERT_END
#define WPWarning(cond, msg) ASSERT_BEGIN do { if (!(cond)) Trinity::Warning(__FILE__, __LINE__, __FUNCTION__, (msg)); } while(0) ASSERT_END
@@ -57,8 +61,10 @@ namespace Trinity
#ifdef PERFORMANCE_PROFILING
#define ASSERT(cond, ...) ((void)0)
+#define ASSERT_NODEBUGINFO(cond, ...) ((void)0)
#else
#define ASSERT WPAssert
+#define ASSERT_NODEBUGINFO WPAssert_NODEBUGINFO
#endif
#define ABORT WPAbort