diff options
Diffstat (limited to 'desktop')
-rw-r--r-- | desktop/source/app/app.cxx | 4 | ||||
-rw-r--r-- | desktop/source/app/crashreport.cxx | 49 | ||||
-rw-r--r-- | desktop/source/app/sofficemain.cxx | 58 |
3 files changed, 50 insertions, 61 deletions
diff --git a/desktop/source/app/app.cxx b/desktop/source/app/app.cxx index 2682c49d769d..b70295f56af6 100644 --- a/desktop/source/app/app.cxx +++ b/desktop/source/app/app.cxx @@ -1126,6 +1126,10 @@ void Desktop::Exception(ExceptionCategory nCategory) // protect against recursive calls static bool bInException = false; +#if HAVE_FEATURE_BREAKPAD + CrashReporter::removeExceptionHandler(); // disallow re-entry +#endif + SystemWindowFlags nOldMode = Application::GetSystemWindowMode(); Application::SetSystemWindowMode( nOldMode & ~SystemWindowFlags::NOAUTOMODE ); if ( bInException ) diff --git a/desktop/source/app/crashreport.cxx b/desktop/source/app/crashreport.cxx index 71434ac5b965..ab19dc6327d7 100644 --- a/desktop/source/app/crashreport.cxx +++ b/desktop/source/app/crashreport.cxx @@ -36,14 +36,44 @@ #if defined __clang__ #pragma clang diagnostic pop #endif +#include <locale> +#include <codecvt> #endif osl::Mutex CrashReporter::maMutex; -google_breakpad::ExceptionHandler* CrashReporter::mpExceptionHandler = nullptr; +std::unique_ptr<google_breakpad::ExceptionHandler> CrashReporter::mpExceptionHandler; bool CrashReporter::mbInit = false; CrashReporter::vmaKeyValues CrashReporter::maKeyValues; +#if defined( UNX ) && !defined MACOSX && !defined IOS && !defined ANDROID +static bool dumpCallback(const google_breakpad::MinidumpDescriptor& descriptor, void* /*context*/, bool succeeded) +{ + CrashReporter::addKeyValue("DumpFile", OStringToOUString(descriptor.path(), RTL_TEXTENCODING_UTF8), CrashReporter::Write); + SAL_WARN("desktop", "minidump generated: " << descriptor.path()); + + return succeeded; +} +#elif defined WNT +static bool dumpCallback(const wchar_t* path, const wchar_t* id, + void* /*context*/, EXCEPTION_POINTERS* /*exinfo*/, + MDRawAssertionInfo* /*assertion*/, + bool succeeded) +{ + // TODO: moggi: can we avoid this conversion +#ifdef _MSC_VER +#pragma warning (disable: 4996) +#endif + std::wstring_convert<std::codecvt_utf8<wchar_t>> conv1; + std::string aPath = conv1.to_bytes(std::wstring(path)) + conv1.to_bytes(std::wstring(id)) + ".dmp"; + CrashReporter::addKeyValue("DumpFile", OStringToOUString(aPath.c_str(), RTL_TEXTENCODING_UTF8), CrashReporter::AddItem); + CrashReporter::addKeyValue("GDIHandles", OUString::number(::GetGuiResources(::GetCurrentProcess(), GR_GDIOBJECTS)), CrashReporter::Write); + SAL_WARN("desktop", "minidump generated: " << aPath); + return succeeded; +} +#endif + + void CrashReporter::writeToFile(std::ios_base::openmode Openmode) { std::ofstream ini_file(getIniFileName(), Openmode); @@ -171,10 +201,21 @@ bool CrashReporter::readSendConfig(std::string& response) return crashreport::readConfig(CrashReporter::getIniFileName(), &response); } -void CrashReporter::storeExceptionHandler(google_breakpad::ExceptionHandler* pExceptionHandler) +void CrashReporter::installExceptionHandler() +{ + if (!IsDumpEnable()) + return; +#if defined( UNX ) && !defined MACOSX && !defined IOS && !defined ANDROID + google_breakpad::MinidumpDescriptor descriptor("/tmp"); + mpExceptionHandler = std::make_unique<google_breakpad::ExceptionHandler>(descriptor, nullptr, dumpCallback, nullptr, true, -1); +#elif defined WNT + mpExceptionHandler = std::make_unique<google_breakpad::ExceptionHandler>(L".", nullptr, dumpCallback, nullptr, google_breakpad::ExceptionHandler::HANDLER_ALL); +#endif +} + +void CrashReporter::removeExceptionHandler() { - if(IsDumpEnable()) - mpExceptionHandler = pExceptionHandler; + mpExceptionHandler.reset(); } diff --git a/desktop/source/app/sofficemain.cxx b/desktop/source/app/sofficemain.cxx index d8fc55d86596..a352286c83d4 100644 --- a/desktop/source/app/sofficemain.cxx +++ b/desktop/source/app/sofficemain.cxx @@ -42,22 +42,6 @@ #if HAVE_FEATURE_BREAKPAD #include <desktop/crashreport.hxx> - -#if defined( UNX ) && !defined MACOSX && !defined IOS && !defined ANDROID -#include <client/linux/handler/exception_handler.h> -#elif defined WNT -#if defined __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wmicrosoft-enum-value" -#endif -#include <client/windows/handler/exception_handler.h> -#if defined __clang__ -#pragma clang diagnostic pop -#endif -#include <locale> -#include <codecvt> -#endif - #endif @@ -70,50 +54,10 @@ # define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, LOGTAG, __VA_ARGS__)) #endif -#if HAVE_FEATURE_BREAKPAD - -#if defined( UNX ) && !defined MACOSX && !defined IOS && !defined ANDROID -static bool dumpCallback(const google_breakpad::MinidumpDescriptor& descriptor, void* /*context*/, bool succeeded) -{ - CrashReporter::addKeyValue("DumpFile", OStringToOUString(descriptor.path(), RTL_TEXTENCODING_UTF8), CrashReporter::Write); - SAL_WARN("desktop", "minidump generated: " << descriptor.path()); - - return succeeded; -} -#elif defined WNT -static bool dumpCallback(const wchar_t* path, const wchar_t* id, - void* /*context*/, EXCEPTION_POINTERS* /*exinfo*/, - MDRawAssertionInfo* /*assertion*/, - bool succeeded) -{ - // TODO: moggi: can we avoid this conversion -#ifdef _MSC_VER -#pragma warning (disable: 4996) -#endif - std::wstring_convert<std::codecvt_utf8<wchar_t>> conv1; - std::string aPath = conv1.to_bytes(std::wstring(path)) + conv1.to_bytes(std::wstring(id)) + ".dmp"; - CrashReporter::addKeyValue("DumpFile", OStringToOUString(aPath.c_str(), RTL_TEXTENCODING_UTF8), CrashReporter::AddItem); - CrashReporter::addKeyValue("GDIHandles", OUString::number(::GetGuiResources (::GetCurrentProcess(), GR_GDIOBJECTS)), CrashReporter::Write); - SAL_WARN("desktop", "minidump generated: " << aPath); - return succeeded; -} -#endif - -#endif extern "C" int DESKTOP_DLLPUBLIC soffice_main() { #if HAVE_FEATURE_BREAKPAD - -#if defined( UNX ) && !defined MACOSX && !defined IOS && !defined ANDROID - google_breakpad::MinidumpDescriptor descriptor("/tmp"); - google_breakpad::ExceptionHandler eh(descriptor, nullptr, dumpCallback, nullptr, true, -1); - - CrashReporter::storeExceptionHandler(&eh); -#elif defined WNT - google_breakpad::ExceptionHandler eh(L".", nullptr, dumpCallback, nullptr, google_breakpad::ExceptionHandler::HANDLER_ALL); - - CrashReporter::storeExceptionHandler(&eh); -#endif + CrashReporter::installExceptionHandler(); #endif #if defined( UNX ) && !defined MACOSX && !defined IOS && !defined ANDROID && !defined(LIBO_HEADLESS) && HAVE_FEATURE_OPENGL |