1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
|
#ifdef ENABLE_BREAKPAD
#if defined(WIN32)
#include <client/windows/handler/exception_handler.h>
#endif
#include <stdio.h>
#include <string>
#include "c_bpwrapper.h"
wchar_t *utf8ToWString(const std::string &src)
{
wchar_t dst[4096];
int len;
len = MultiByteToWideChar
(CP_UTF8, /* multibyte code page */
0, /* flags */
src.c_str(), /* src */
-1, /* src len, -1 for all includes \0 */
dst, /* dst */
sizeof(dst) / sizeof(wchar_t)); /* dst buf len */
if (len <= 0) {
return NULL;
}
return _wcsdup(dst);
}
std::string wStringToUtf8(const wchar_t *src)
{
char dst[4096];
int len;
len = WideCharToMultiByte
(CP_UTF8, /* multibyte code page */
0, /* flags */
src, /* src */
-1, /* src len, -1 for all includes \0 */
dst, /* dst */
sizeof(dst), /* dst buf len */
NULL, /* default char */
NULL); /* BOOL flag indicates default char is used */
if (len <= 0) {
return "";
}
return dst;
}
std::string wStringToLocale(const wchar_t *src)
{
char dst[4096];
int len;
len = WideCharToMultiByte
(CP_ACP, /* multibyte code page */
0, /* flags */
src, /* src */
-1, /* src len, -1 for all includes \0 */
dst, /* dst */
sizeof(dst), /* dst buf len */
NULL, /* default char */
NULL); /* BOOL flag indicates default char is used */
if (len <= 0) {
return "";
}
return dst;
}
bool DumpCallback(const wchar_t *dump_path,
const wchar_t *minidump_id,
void *context,
EXCEPTION_POINTERS *exinfo,
MDRawAssertionInfo *assertion,
bool succeeded)
{
printf("program dump %s\n", succeeded ? "succeeded" : "failed");
printf("program crashed, you can find the minidump in %s\n", wStringToLocale(dump_path).c_str());
printf("minidump id: %s\n", wStringToLocale(minidump_id).c_str());
return succeeded;
}
extern "C" {
CBPWrapperExceptionHandler newCBPWrapperExceptionHandler(const char *dump_dir)
{
printf("initializing crash reporter\n");
std::wstring path = utf8ToWString(dump_dir);
return reinterpret_cast<void *>(new google_breakpad::ExceptionHandler(
path, NULL,
(google_breakpad::ExceptionHandler::MinidumpCallback)DumpCallback, NULL,
google_breakpad::ExceptionHandler::HANDLER_ALL));
}
}
#endif
|