Skip to content

Commit 1ef0c55

Browse files
committed
add breakpad crash handler for Windows
Integrate and modify code from this demo: https://github.com/KandaoVR/qt-breakpad Use the latest version of breakpad with the cmake file from the vcpkg port. To enable the crash handler, pass the cmake option to `generate.py`, e.g.: ```bash python ./generate.py -cmake-flags '-DENABLE_CRASH_HANDLER=ON' release ``` It will then be activated for both the terminal and the signer. TODO: - clean up systray icon - find or write submit URL handler - see if mac and linux can work Signed-off-by: Rafael Kitover <rkitover@gmail.com>
1 parent 35ee785 commit 1ef0c55

19 files changed

+1243
-0
lines changed

.gitmodules

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,6 @@
77
[submodule "AuthAPI"]
88
path = AuthAPI
99
url = https://github.com/autheid/AuthAPI
10+
[submodule "breakpad/breakpad"]
11+
path = breakpad/breakpad
12+
url = https://github.com/google/breakpad.git

BlockSettleApp/CMakeLists.txt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@ PROJECT( ${BLOCKSETTLE_APP_NAME} )
33
FILE(GLOB SOURCES *.cpp)
44
FILE(GLOB HEADERS *.h)
55

6+
if(WIN32 AND ENABLE_CRASH_HANDLER)
7+
set(SOURCES ${SOURCES} ../breakpad/qtsystemexceptionhandler.cpp)
8+
set(HEADERS ${HEADERS} ../breakpad/qtsystemexceptionhandler.h)
9+
endif()
10+
611
INCLUDE_DIRECTORIES( ${COMMON_LIB_INCLUDE_DIR} )
712
INCLUDE_DIRECTORIES( ${BLOCKSETTLE_UI_INCLUDE_DIR} )
813
INCLUDE_DIRECTORIES( ${BS_NETWORK_INCLUDE_DIR} )
@@ -13,6 +18,7 @@ INCLUDE_DIRECTORIES( ${CRYPTO_LIB_INCLUDE_DIR} )
1318
INCLUDE_DIRECTORIES( ${BOTAN_INCLUDE_DIR} )
1419
INCLUDE_DIRECTORIES( ${Qt5Svg_INCLUDE_DIRS} )
1520

21+
1622
IF ( APPLE )
1723
SET( BUNDLE_NAME "BlockSettle Terminal" )
1824

@@ -57,4 +63,13 @@ TARGET_LINK_LIBRARIES( ${BLOCKSETTLE_APP_NAME}
5763
${QT_LIBS}
5864
${OS_SPECIFIC_LIBS}
5965
${OPENSSL_LIBS}
66+
)
67+
68+
if(WIN32 AND ENABLE_CRASH_HANDLER)
69+
target_include_directories(${BLOCKSETTLE_APP_NAME}
70+
PRIVATE ${CMAKE_BINARY_DIR}/common/BlockSettleUILib # for TerminalVersion.h
71+
PRIVATE ../breakpad
6072
)
73+
target_compile_definitions(${BLOCKSETTLE_APP_NAME} PRIVATE -DENABLE_QT_BREAKPAD)
74+
target_link_libraries(${BLOCKSETTLE_APP_NAME} libbreakpad)
75+
endif()

BlockSettleApp/main.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,12 @@
2121

2222
#include "btc/ecc.h"
2323

24+
#include "TerminalVersion.h"
25+
26+
#ifdef ENABLE_QT_BREAKPAD
27+
#include "qtsystemexceptionhandler.h"
28+
#endif
29+
2430
#ifdef USE_QWindowsIntegrationPlugin
2531
Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin)
2632
Q_IMPORT_PLUGIN(QWindowsPrinterSupportPlugin)
@@ -167,6 +173,14 @@ static int GuiApp(int &argc, char** argv)
167173
QApplication app(argc, argv);
168174
#endif
169175

176+
app.setApplicationVersion(QLatin1String(TERMINAL_VERSION_STRING));
177+
178+
#ifdef ENABLE_QT_BREAKPAD
179+
QtSystemExceptionHandler exceptionHandler(app.applicationDirPath());
180+
#endif
181+
182+
QApplication::setOrganizationName(QLatin1String("BlockSettle"));
183+
QApplication::setApplicationName(QLatin1String("Terminal"));
170184

171185
QApplication::setQuitOnLastWindowClosed(false);
172186

@@ -251,6 +265,7 @@ static int GuiApp(int &argc, char** argv)
251265
splashScreen.setGeometry(splashGeometry);
252266

253267
splashScreen.show();
268+
254269
app.processEvents();
255270

256271
#ifdef NDEBUG
@@ -260,6 +275,9 @@ static int GuiApp(int &argc, char** argv)
260275
#endif
261276
}
262277

278+
#include <QTextStream>
279+
#include <QFile>
280+
263281
int main(int argc, char** argv)
264282
{
265283
srand(std::time(nullptr));

BlockSettleSigner/CMakeLists.txt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ LIST(APPEND HEADERS ${HEADERS_QML})
1414

1515
FILE(GLOB RESOURCE_FILES *.qrc)
1616

17+
if(WIN32 AND ENABLE_CRASH_HANDLER)
18+
set(SOURCES ${SOURCES} ../breakpad/qtsystemexceptionhandler.cpp)
19+
set(HEADERS ${HEADERS} ../breakpad/qtsystemexceptionhandler.h)
20+
endif()
1721

1822
INCLUDE_DIRECTORIES( interfaces/GUI_QML )
1923
INCLUDE_DIRECTORIES( ${COMMON_LIB_INCLUDE_DIR} )
@@ -81,3 +85,12 @@ TARGET_LINK_LIBRARIES(${SIGNER_APP_NAME}
8185
${OS_SPECIFIC_LIBS}
8286
${OPENSSL_LIBS}
8387
)
88+
89+
if(WIN32 AND ENABLE_CRASH_HANDLER)
90+
target_include_directories(${SIGNER_APP_NAME}
91+
PRIVATE ${CMAKE_BINARY_DIR}/common/BlockSettleUILib # for TerminalVersion.h
92+
PRIVATE ../breakpad
93+
)
94+
target_compile_definitions(${SIGNER_APP_NAME} PRIVATE -DENABLE_QT_BREAKPAD)
95+
target_link_libraries(${SIGNER_APP_NAME} libbreakpad)
96+
endif()

BlockSettleSigner/main.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,12 @@
3434
#include "QMLApp.h"
3535
#include "QmlBridge.h"
3636

37+
#include "TerminalVersion.h"
38+
39+
#ifdef ENABLE_QT_BREAKPAD
40+
#include "qtsystemexceptionhandler.h"
41+
#endif
42+
3743
Q_DECLARE_METATYPE(std::string)
3844
Q_DECLARE_METATYPE(std::vector<BinaryData>)
3945
Q_DECLARE_METATYPE(BinaryData)
@@ -179,6 +185,12 @@ static int QMLApp(int argc, char **argv
179185
QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
180186
QApplication app(argc, argv);
181187

188+
app.setApplicationVersion(QLatin1String(TERMINAL_VERSION_STRING));
189+
190+
#ifdef ENABLE_QT_BREAKPAD
191+
QtSystemExceptionHandler exceptionHandler(app.applicationDirPath());
192+
#endif
193+
182194
QApplication::setOrganizationDomain(QLatin1String("blocksettle.com"));
183195
#ifdef __linux__
184196
// Needed for consistency (headless now uses company name in lowercase on Linux)

CMakeLists.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ endif()
1414

1515
option(BSTERMINAL_SHARED_LIBS "Build shared libraries" OFF)
1616

17+
option(ENABLE_CRASH_HANDLER "Enable the crash handler" OFF)
18+
1719
add_definitions(-DSTATIC_BUILD)
1820
add_definitions(-DSPDLOG_ACTIVE_LEVEL=SPDLOG_LEVEL_DEBUG)
1921

@@ -797,6 +799,11 @@ ADD_SUBDIRECTORY( Celer )
797799
ADD_SUBDIRECTORY( common/Blocksettle_proto )
798800
ADD_SUBDIRECTORY( AuthAPI )
799801

802+
if(WIN32 AND ENABLE_CRASH_HANDLER)
803+
add_subdirectory(breakpad)
804+
add_subdirectory(qtcrashhandler)
805+
endif()
806+
800807
ADD_SUBDIRECTORY(BlockSettleApp)
801808
ADD_SUBDIRECTORY(BlockSettleSigner)
802809

breakpad/CMakeLists.txt

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
cmake_minimum_required(VERSION 3.0.2)
2+
project(libbreakpad CXX)
3+
4+
set(CMAKE_CXX_STANDARD 11)
5+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
6+
7+
add_definitions(
8+
-DNOMINMAX
9+
-DUNICODE
10+
-DWIN32_LEAN_AND_MEAN
11+
-D_CRT_SECURE_NO_WARNINGS
12+
-D_CRT_SECURE_NO_DEPRECATE
13+
-D_CRT_NONSTDC_NO_DEPRECATE
14+
-D_LIBCPP_VERSION
15+
)
16+
17+
file(GLOB_RECURSE LIBBREAKPAD_CLIENT_SOURCES breakpad/src/client/windows/*.cc breakpad/src/common/windows/*.cc)
18+
19+
include_directories("$ENV{VSINSTALLDIR}/DIA SDK/include")
20+
21+
file(GLOB LIBBREAKPAD_COMMON_SOURCES breakpad/src/common/*.cc breakpad/src/common/*.c breakpad/src/client/*.cc)
22+
23+
list(APPEND LIBBREAKPAD_CLIENT_SOURCES ${LIBBREAKPAD_COMMON_SOURCES})
24+
25+
list(FILTER LIBBREAKPAD_CLIENT_SOURCES EXCLUDE REGEX "/tests|/unittests|_unittest")
26+
27+
list(FILTER LIBBREAKPAD_CLIENT_SOURCES EXCLUDE REGEX "language.cc|path_helper.cc|stabs_to_module.cc|stabs_reader.cc|minidump_file_writer.cc")
28+
29+
add_library(libbreakpad ${LIBBREAKPAD_CLIENT_SOURCES})
30+
31+
target_link_libraries(libbreakpad PRIVATE wininet.lib)
32+
33+
target_include_directories(libbreakpad
34+
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/breakpad/src
35+
)

breakpad/breakpad

Submodule breakpad added at db1cda2

0 commit comments

Comments
 (0)