Browse Source

Merge pull request #486 from zrax/hsAssert_linux

Make hsAssert useful on Linux / Mac
Adam Johnson 9 years ago
parent
commit
28758b9469
  1. 7
      CMakeLists.txt
  2. 70
      Sources/Plasma/CoreLib/HeadSpin.cpp
  3. 5
      Sources/Plasma/CoreLib/HeadSpin.h

7
CMakeLists.txt

@ -22,12 +22,19 @@ include(cmake/CompilerChecks.cmake)
if(WIN32 AND NOT CYGWIN) if(WIN32 AND NOT CYGWIN)
add_definitions(-DHS_BUILD_FOR_WIN32) add_definitions(-DHS_BUILD_FOR_WIN32)
endif(WIN32 AND NOT CYGWIN) endif(WIN32 AND NOT CYGWIN)
if(UNIX) if(UNIX)
# This is set for both Linux and Mac builds
add_definitions(-DHS_BUILD_FOR_UNIX) add_definitions(-DHS_BUILD_FOR_UNIX)
endif(UNIX) endif(UNIX)
if(APPLE AND ${CMAKE_SYSTEM_NAME} MATCHES "Darwin") if(APPLE AND ${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
add_definitions(-DHS_BUILD_FOR_OSX) add_definitions(-DHS_BUILD_FOR_OSX)
endif(APPLE AND ${CMAKE_SYSTEM_NAME} MATCHES "Darwin") endif(APPLE AND ${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
add_definitions(-DHS_BUILD_FOR_LINUX)
endif(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
# End HeadSpin Configuration # End HeadSpin Configuration
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")

70
Sources/Plasma/CoreLib/HeadSpin.cpp

@ -46,8 +46,20 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com
#ifdef _MSC_VER #ifdef _MSC_VER
# include <crtdbg.h> # include <crtdbg.h>
#endif #endif
#pragma hdrstop #pragma hdrstop
#if defined(HS_DEBUGGING) && defined(HS_BUILD_FOR_UNIX)
# include <cstring>
# include <sys/stat.h>
# include <fcntl.h>
# include <unistd.h>
#endif
#if defined(HS_BUILD_FOR_UNIX)
# include <signal.h>
#endif
#include "hsTemplates.h" #include "hsTemplates.h"
#include "plFormat.h" #include "plFormat.h"
@ -118,17 +130,20 @@ void ErrorAssert(int line, const char* file, const char* fmt, ...)
va_list args; va_list args;
va_start(args, fmt); va_start(args, fmt);
vsnprintf(msg, arrsize(msg), fmt, args); vsnprintf(msg, arrsize(msg), fmt, args);
#if defined(HS_DEBUGGING) && defined(_MSC_VER) #if defined(HS_DEBUGGING)
#if defined(_MSC_VER)
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 // HS_DEBUGGING #endif // _MSC_VER
if (DebugIsDebuggerPresent()) { {
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);
DebugBreakAlways();
} }
#endif // HS_DEBUGGING
#else #else
DebugBreakIfDebuggerPresent(); DebugBreakIfDebuggerPresent();
#endif // defined(HS_DEBUGGING) || !defined(PLASMA_EXTERNAL_RELEASE) #endif // defined(HS_DEBUGGING) || !defined(PLASMA_EXTERNAL_RELEASE)
@ -136,8 +151,27 @@ void ErrorAssert(int line, const char* file, const char* fmt, ...)
bool DebugIsDebuggerPresent() bool DebugIsDebuggerPresent()
{ {
#ifdef _MSC_VER #if defined(HS_BUILD_FOR_WIN32)
return IsDebuggerPresent(); return IsDebuggerPresent();
#elif defined(HS_BUILD_FOR_LINUX)
// From http://google-perftools.googlecode.com/svn/trunk/src/heap-checker.cc
char buf[256]; // TracerPid comes relatively earlier in status output
int fd = open("/proc/self/status", O_RDONLY);
if (fd == -1) {
return false; // Can't tell for sure.
}
const int len = read(fd, buf, sizeof(buf));
bool rc = false;
if (len > 0) {
const char* const kTracerPid = "TracerPid:\t";
buf[len - 1] = '\0';
const char* p = strstr(buf, kTracerPid);
if (p) {
rc = (strncmp(p + strlen(kTracerPid), "0\n", 2) != 0);
}
}
close(fd);
return rc;
#else #else
// FIXME // FIXME
return false; return false;
@ -146,7 +180,7 @@ bool DebugIsDebuggerPresent()
void DebugBreakIfDebuggerPresent() void DebugBreakIfDebuggerPresent()
{ {
#ifdef _MSC_VER #if defined(_MSC_VER)
__try __try
{ {
__debugbreak(); __debugbreak();
@ -154,6 +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)
raise(SIGTRAP);
#else
// FIXME
abort();
#endif // _MSC_VER #endif // _MSC_VER
} }
@ -164,13 +215,14 @@ void DebugMsg(const char* fmt, ...)
va_start(args, fmt); va_start(args, fmt);
vsnprintf(msg, arrsize(msg), fmt, args); vsnprintf(msg, arrsize(msg), fmt, args);
#ifdef _MSC_VER
if (DebugIsDebuggerPresent()) if (DebugIsDebuggerPresent())
{ {
#ifdef _MSC_VER
OutputDebugStringA(msg); OutputDebugStringA(msg);
OutputDebugStringA("\n"); OutputDebugStringA("\n");
} else
#endif #endif
} else { {
fprintf(stderr, "%s\n", msg); fprintf(stderr, "%s\n", msg);
} }
} }

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