Browse Source

Fix ErrorAssert handling to allow bypassing the assert if we're attached to a debugger

Michael Hansen 9 years ago
parent
commit
6ad2f7ae24
  1. 22
      Sources/Plasma/CoreLib/HeadSpin.cpp
  2. 5
      Sources/Plasma/CoreLib/HeadSpin.h

22
Sources/Plasma/CoreLib/HeadSpin.cpp

@ -135,16 +135,13 @@ void ErrorAssert(int line, const char* file, const char* fmt, ...)
if (s_GuiAsserts) if (s_GuiAsserts)
{ {
if (_CrtDbgReport(_CRT_ASSERT, file, line, NULL, msg)) if (_CrtDbgReport(_CRT_ASSERT, file, line, NULL, msg))
DebugBreak(); DebugBreakAlways();
} else } else
#endif // _MSC_VER #endif // _MSC_VER
{ {
char str[] = "-------\nASSERTION FAILED:\nFile: %s Line: %i\nMessage: %s\n-------"; char str[] = "-------\nASSERTION FAILED:\nFile: %s Line: %i\nMessage: %s\n-------";
DebugMsg(str, file, line, msg); DebugMsg(str, file, line, msg);
DebugBreakIfDebuggerPresent(); DebugBreakAlways();
// In case the debug trap is ignored
abort();
} }
#endif // HS_DEBUGGING #endif // HS_DEBUGGING
#else #else
@ -191,8 +188,23 @@ void DebugBreakIfDebuggerPresent()
// Debugger not present or some such shwiz. // Debugger not present or some such shwiz.
// Whatever. Don't crash here. // Whatever. Don't crash here.
} }
#elif defined(HS_BUILD_FOR_UNIX)
if (DebugIsDebuggerPresent())
raise(SIGTRAP);
#else
// FIXME
#endif // _MSC_VER
}
void DebugBreakAlways()
{
#if defined(_MSC_VER)
DebugBreak();
#elif defined(HS_BUILD_FOR_UNIX) #elif defined(HS_BUILD_FOR_UNIX)
raise(SIGTRAP); raise(SIGTRAP);
#else
// FIXME
abort();
#endif // _MSC_VER #endif // _MSC_VER
} }

5
Sources/Plasma/CoreLib/HeadSpin.h

@ -374,8 +374,9 @@ hsDebugMessageProc hsSetStatusMessageProc(hsDebugMessageProc newProc);
void ErrorEnableGui (bool enabled); void ErrorEnableGui (bool enabled);
void ErrorAssert (int line, const char* file, const char* fmt, ...); void ErrorAssert (int line, const char* file, const char* fmt, ...);
bool DebugIsDebuggerPresent (); bool DebugIsDebuggerPresent();
void DebugBreakIfDebuggerPresent (); void DebugBreakIfDebuggerPresent();
void DebugBreakAlways();
void DebugMsg(const char* fmt, ...); void DebugMsg(const char* fmt, ...);
#ifdef HS_DEBUGGING #ifdef HS_DEBUGGING

Loading…
Cancel
Save