После нескольких часов поиска этой ошибки компоновщика это не увенчалось успехом :(
Действия по воспроизведению:
- Установите
gyp
иPATH
- Открыть
VS2015 x86 Native Tools Command Prompt
- Run:
git clone https://chromium.googlesource.com/breakpad/breakpad && cd breakpad
cd src && git clone https://github.com/google/googletest testing && cd ..
gyp -–no-circular-check src\client\windows\breakpad_client.gyp
- Открыть
src\client\windows\breakpad_client.sln
- Перейдите к проектам
Properties>C/C++/General
и изменитеTreat Warnings As Errors
наNo
для конфигурации crash_generation_client, common, exception_handler дляDebug
иRelease
конфигурации. - Перейдите к проектам
Properties>C/C++/General
и изменитеTreat wchar_t as Built-in Type
наNo
для конфигурации crash_generation_client, common, exception_handler дляDebug
иRelease
. - Построить все для
Debug
- Построить все для
Release
- Свяжите библиотеки, расположенные в
breakpad\src\client\windows\Debug\lib
иbreakpad\src\client\windows\Release\lib
, с вашим приложением, в моем случае файлQt qmake
, как показано ниже:
win32:debug {
BREAKPAD_PATH = $$PWD/../../../LIBS/breakpad
INCLUDEPATH += $$BREAKPAD_PATH/src
LIBS += -L$$BREAKPAD_PATH/client/windows/Debug/lib/crash_generation_client.lib
LIBS += -L$$BREAKPAD_PATH/client/windows/Debug/lib/exception_handler.lib
LIBS += -L$$BREAKPAD_PATH/client/windows/Debug/lib/common.lib
PRE_TARGETDEPS += $$BREAKPAD_PATH/client/windows/Debug/lib/crash_generation_client.lib
PRE_TARGETDEPS += $$BREAKPAD_PATH/client/windows/Debug/lib/exception_handler.lib
PRE_TARGETDEPS += $$BREAKPAD_PATH/client/windows/Debug/lib/common.lib
} else:release {
BREAKPAD_PATH = $$PWD/../../../LIBS/breakpad
INCLUDEPATH += $$BREAKPAD_PATH/src
LIBS += -L$$BREAKPAD_PATH/client/windows/Release/lib/crash_generation_client.lib
LIBS += -L$$BREAKPAD_PATH/client/windows/Release/lib/exception_handler.lib
LIBS += -L$$BREAKPAD_PATH/client/windows/Release/lib/common.lib
PRE_TARGETDEPS += $$BREAKPAD_PATH/client/windows/Release/lib/crash_generation_client.lib
PRE_TARGETDEPS += $$BREAKPAD_PATH/client/windows/Release/lib/exception_handler.lib
PRE_TARGETDEPS += $$BREAKPAD_PATH/client/windows/Release/lib/common.lib
}
- Компоновщик должен вывести следующую ошибку:
#P3#
crash_handler.h
:
#ifndef _CRASH_HANDLER_H
#define _CRASH_HANDLER_H
namespace breakpad {
class CrashHandlerPrivate;
class CrashHandler {
public:
static CrashHandler* instance();
void init(const QString& reportPath);
void setReportCrashesToSystem(bool report);
bool writeMinidump();
private:
CrashHandler();
~CrashHandler();
private:
CrashHandlerPrivate* d;
Q_DISABLE_COPY(CrashHandler)
};
} // namespace breakpad
#endif // !_CRASH_HANDLER_H
crash_handler.cpp
#include "crash_handler.h"
#if defined(Q_OS_LINUX)
#include "client/linux/handler/exception_handler.h"
#elif defined(Q_OS_WIN32)
#include "client/windows/handler/exception_handler.h"
#endif
namespace breakpad {
class CrashHandlerPrivate {
public:
CrashHandlerPrivate() {
pHandler = NULL;
}
~CrashHandlerPrivate() {
delete pHandler;
}
void initCrashHandler(const QString& dumpPath);
public:
static google_breakpad::ExceptionHandler* pHandler;
static bool bReportCrashesToSystem;
};
google_breakpad::ExceptionHandler* CrashHandlerPrivate::pHandler = NULL;
bool CrashHandlerPrivate::bReportCrashesToSystem = false;
/************************************************************************/
/* DumpCallback */
/************************************************************************/
#if defined(Q_OS_WIN32)
bool DumpCallback(const wchar_t* _dump_dir, const wchar_t* _minidump_id, void* context, EXCEPTION_POINTERS* exinfo, MDRawAssertionInfo* assertion, bool success)
#elif defined(Q_OS_LINUX)
bool DumpCallback(const google_breakpad::MinidumpDescriptor &md, void *context, bool success)
#endif
{
Q_UNUSED(context);
#if defined(Q_OS_WIN32)
Q_UNUSED(_dump_dir);
Q_UNUSED(_minidump_id);
Q_UNUSED(assertion);
Q_UNUSED(exinfo);
#endif
qDebug("BreakpadQt crash");
/*
NO STACK USE, NO HEAP USE THERE !!!
Creating QString's, using qDebug, etc. - everything is crash-unfriendly.
*/
return CrashHandlerPrivate::bReportCrashesToSystem ? success : true;
}
void CrashHandlerPrivate::initCrashHandler(const QString& dumpPath)
{
if (pHandler != NULL)
return;
#if defined(Q_OS_WIN32)
std::wstring pathAsStr = (const wchar_t*)dumpPath.utf16();
pHandler = new google_breakpad::ExceptionHandler(
pathAsStr,
/*FilterCallback*/ 0,
DumpCallback,
/*context*/
0,
true
);
#elif defined(Q_OS_LINUX)
std::string pathAsStr = dumpPath.toStdString();
google_breakpad::MinidumpDescriptor md(pathAsStr);
pHandler = new google_breakpad::ExceptionHandler(
md,
/*FilterCallback*/ 0,
DumpCallback,
/*context*/ 0,
true,
-1
);
#endif
}
CrashHandler* CrashHandler::instance() {
static CrashHandler globalHandler;
return &globalHandler;
}
CrashHandler::CrashHandler() {
d = new CrashHandlerPrivate();
}
CrashHandler::~CrashHandler() {
delete d;
}
void CrashHandler::setReportCrashesToSystem(bool report) {
d->bReportCrashesToSystem = report;
}
bool CrashHandler::writeMinidump() {
bool res = d->pHandler->WriteMinidump();
if (res) {
qDebug("BreakpadQt: writeMinidump() success.");
} else {
qWarning("BreakpadQt: writeMinidump() failed.");
}
return res;
}
void CrashHandler::init(const QString& reportPath) {
d->initCrashHandler(reportPath);
}
} // namespace breakpad
Неужели не знаю в чем проблема?!
Конфигурация:
OS:
Windows 10(1809)
Система сборки:
MSVC14.0(2015)
Версия Qt:
5.8(32bit)