diff --git a/CMakeLists.txt b/CMakeLists.txt index caed4dda44..c087e91808 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -143,6 +143,16 @@ if (STATIC) endif (WIN32) endif () +option(WITH_BREAKPAD "Enable breakpad") +if (WITH_BREAKPAD) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DUSE_BREAKPAD") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUSE_BREAKPAD") + set(BREAKPAD_DIR "/home/janisozaur/workspace/breakpad/src") + set(BREAKPAD_INCLUDE_DIR "${BREAKPAD_DIR}/src") + set(BREAKPAD_LIBRARY_DIR "${BREAKPAD_DIR}/src/client/linux") + set(BREAKPAD_LIBS breakpad_client pthread) +endif (WITH_BREAKPAD) + # find and include SDL2 PKG_CHECK_MODULES(SDL2 REQUIRED sdl2 SDL2_ttf) if (STATIC) @@ -180,9 +190,9 @@ if (UNIX) set(DLLIB dl) endif (UNIX) -INCLUDE_DIRECTORIES(${SDL2_INCLUDE_DIRS} ${LIBCURL_INCLUDE_DIRS} ${JANSSON_INCLUDE_DIRS} ${SPEEX_INCLUDE_DIRS} ${PNG_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIRS}) +INCLUDE_DIRECTORIES(${SDL2_INCLUDE_DIRS} ${LIBCURL_INCLUDE_DIRS} ${JANSSON_INCLUDE_DIRS} ${SPEEX_INCLUDE_DIRS} ${PNG_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIRS} ${BREAKPAD_INCLUDE_DIR}) -LINK_DIRECTORIES(${SDL2_LIBRARY_DIRS} ${JANSSON_LIBRARY_DIRS} ${LIBCURL_LIBRARY_DIRS} ${PNG_LIBRARY_DIRS} ${ZLIB_LIBRARY_DIRS}) +LINK_DIRECTORIES(${SDL2_LIBRARY_DIRS} ${JANSSON_LIBRARY_DIRS} ${LIBCURL_LIBRARY_DIRS} ${PNG_LIBRARY_DIRS} ${ZLIB_LIBRARY_DIRS} ${BREAKPAD_LIBRARY_DIR}) if (WIN32) # build as library for now, replace with add_executable @@ -215,7 +225,7 @@ endif (UNIX AND NOT APPLE) # libopenrct2.dll -> openrct2.dll set_target_properties(${PROJECT} PROPERTIES PREFIX "") -TARGET_LINK_LIBRARIES(${PROJECT} ${SDL2LIBS} ${HTTPLIBS} ${NETWORKLIBS} ${SPEEX_LIBRARIES} ${DLLIB} ${REQUIREDLIBS}) +TARGET_LINK_LIBRARIES(${PROJECT} ${SDL2LIBS} ${HTTPLIBS} ${NETWORKLIBS} ${SPEEX_LIBRARIES} ${DLLIB} ${REQUIREDLIBS} ${BREAKPAD_LIBS}) if (APPLE OR STATIC) FIND_LIBRARY(ICONV_LIBRARIES NAMES iconv libiconv libiconv-2 c) diff --git a/src/openrct2.c b/src/openrct2.c index 87ee82cc9b..b5c6648374 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -39,6 +39,7 @@ #include "util/sawyercoding.h" #include "util/util.h" #include "world/mapgen.h" +#include "platform/breakpad.h" #if defined(__unix__) #include @@ -263,6 +264,12 @@ bool openrct2_initialise() */ void openrct2_launch() { +#ifdef USE_BREAKPAD + CExceptionHandler eh; + // never free + eh = newCExceptionHandlerSimple(); +#endif // USE_BREAKPAD + if (openrct2_initialise()) { RCT2_GLOBAL(RCT2_ADDRESS_RUN_INTRO_TICK_PART, uint8) = 0; if((gOpenRCT2StartupAction == STARTUP_ACTION_TITLE) && gConfigGeneral.play_intro) diff --git a/src/platform/breakpad.cpp b/src/platform/breakpad.cpp new file mode 100644 index 0000000000..a4241019cf --- /dev/null +++ b/src/platform/breakpad.cpp @@ -0,0 +1,19 @@ +#include "breakpad.h" + +#ifdef USE_BREAKPAD +#include "client/linux/handler/exception_handler.h" +#include + +static bool dumpCallback(const google_breakpad::MinidumpDescriptor& descriptor, void* context, bool succeeded) { + printf("Dump path: %s\n", descriptor.path()); + return succeeded; +} + +extern "C" CExceptionHandler newCExceptionHandlerSimple(void) +{ + printf("init Simple breakpad\n"); + google_breakpad::MinidumpDescriptor descriptor("/tmp"); + //google_breakpad::ExceptionHandler eh(descriptor, NULL, dumpCallback, NULL, true, -1); + return reinterpret_cast(new google_breakpad::ExceptionHandler(descriptor, NULL, dumpCallback, NULL, true, -1)); +} +#endif // USE_BREAKPAD diff --git a/src/platform/breakpad.h b/src/platform/breakpad.h new file mode 100644 index 0000000000..31e358a4a5 --- /dev/null +++ b/src/platform/breakpad.h @@ -0,0 +1,17 @@ +#ifndef _OPENRCT2_BREAKPAD_ +#define _OPENRCT2_BREAKPAD_ + +#ifdef USE_BREAKPAD +typedef void* CExceptionHandler; + +#ifdef __cplusplus +extern "C" +{ +#endif +CExceptionHandler newCExceptionHandlerSimple(void); +#ifdef __cplusplus +} +#endif +#endif // USE_BREAKPAD + +#endif /* _OPENRCT2_BREAKPAD_ */