preliminary google crashpad integration
First attempt at automated out-of-process crash reporting. Have only updated AppVeyor script so far, so if this works (which it won't), it'll only work on Windows.
This commit is contained in:
+17
-5
@@ -30,8 +30,17 @@ curl https://ffmpeg.zeranoe.com/builds/win64/shared/%FFMPEG_VER%-shared.zip > %F
|
|||||||
7z x %FFMPEG_VER%-dev.zip
|
7z x %FFMPEG_VER%-dev.zip
|
||||||
7z x %FFMPEG_VER%-shared.zip
|
7z x %FFMPEG_VER%-shared.zip
|
||||||
|
|
||||||
REM Add Qt and FFmpeg directory to path
|
REM Acquire Google Crashpad
|
||||||
set PATH=%PATH%;C:\Qt\5.13.2\msvc2017_64\bin;%APPVEYOR_BUILD_FOLDER%\%FFMPEG_VER%-dev
|
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
|
||||||
|
set PATH=%PATH%;%APPVEYOR_BUILD_FOLDER%\depot_tools
|
||||||
|
fetch crashpad
|
||||||
|
cd crashpad
|
||||||
|
gn gen out/Default
|
||||||
|
ninja -C out/Default
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
REM Add Qt, FFmpeg, and Crashpad to path
|
||||||
|
set PATH=%PATH%;C:\Qt\5.13.2\msvc2017_64\bin;%APPVEYOR_BUILD_FOLDER%\%FFMPEG_VER%-dev;%APPVEYOR_BUILD_FOLDER%\crashpad;%APPVEYOR_BUILD_FOLDER%\crashpad\out\Default
|
||||||
|
|
||||||
REM Run cmake
|
REM Run cmake
|
||||||
cmake -G "Ninja" . -DCMAKE_TOOLCHAIN_FILE=c:/Tools/vcpkg/scripts/buildsystems/vcpkg.cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo
|
cmake -G "Ninja" . -DCMAKE_TOOLCHAIN_FILE=c:/Tools/vcpkg/scripts/buildsystems/vcpkg.cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo
|
||||||
@@ -42,12 +51,18 @@ ninja.exe || exit /B 1
|
|||||||
REM If this is a pull request, no further packaging/deploying needs to be done
|
REM If this is a pull request, no further packaging/deploying needs to be done
|
||||||
if NOT "%APPVEYOR_PULL_REQUEST_NUMBER%" == "" goto end
|
if NOT "%APPVEYOR_PULL_REQUEST_NUMBER%" == "" goto end
|
||||||
|
|
||||||
|
REM Create Crashpad symbol file and upload it
|
||||||
|
wget https://github.com/google/breakpad/blob/master/src/tools/windows/binaries/dump_syms.exe?raw=true -O dump_syms.exe
|
||||||
|
dump_syms app\olive-editor.pdb > olive-editor.sym
|
||||||
|
curl -F symfile=@olive-editor.sym https://olivevideoeditor.org/crashpad/symbols.php
|
||||||
|
|
||||||
REM Start building package
|
REM Start building package
|
||||||
mkdir olive-editor
|
mkdir olive-editor
|
||||||
cd olive-editor
|
cd olive-editor
|
||||||
copy ..\app\olive-editor.exe .
|
copy ..\app\olive-editor.exe .
|
||||||
copy ..\app\olive-editor.pdb .
|
copy ..\app\olive-editor.pdb .
|
||||||
copy ..\app\crashhandler.exe .
|
copy ..\app\crashhandler.exe .
|
||||||
|
copy ..\crashpad\out\Default\crashpad_handler.exe .
|
||||||
windeployqt olive-editor.exe
|
windeployqt olive-editor.exe
|
||||||
copy ..\%FFMPEG_VER%-shared\bin\*.dll .
|
copy ..\%FFMPEG_VER%-shared\bin\*.dll .
|
||||||
copy C:\Tools\vcpkg\installed\x64-windows\bin\OpenColorIO.dll .
|
copy C:\Tools\vcpkg\installed\x64-windows\bin\OpenColorIO.dll .
|
||||||
@@ -85,9 +100,6 @@ REM Create portable
|
|||||||
copy nul olive-editor\portable
|
copy nul olive-editor\portable
|
||||||
7z a %PKGNAME%.zip olive-editor
|
7z a %PKGNAME%.zip olive-editor
|
||||||
|
|
||||||
REM We're ready to upload, but we only upload *sometimes*
|
|
||||||
REM set PATH=%PATH%;C:\msys64\usr\bin
|
|
||||||
|
|
||||||
REM If this was a tagged build, upload
|
REM If this was a tagged build, upload
|
||||||
if "%APPVEYOR_REPO_TAG%"=="true" GOTO upload
|
if "%APPVEYOR_REPO_TAG%"=="true" GOTO upload
|
||||||
|
|
||||||
|
|||||||
@@ -67,6 +67,12 @@ find_package(FFMPEG 3.0 REQUIRED
|
|||||||
swresample
|
swresample
|
||||||
)
|
)
|
||||||
|
|
||||||
|
find_package(GoogleCrashpad)
|
||||||
|
|
||||||
|
if (NOT GoogleCrashpad_FOUND)
|
||||||
|
message(" Automatic crash reporting will be disabled.")
|
||||||
|
endif()
|
||||||
|
|
||||||
if(EXISTS "${CMAKE_SOURCE_DIR}/.git")
|
if(EXISTS "${CMAKE_SOURCE_DIR}/.git")
|
||||||
find_package(Git)
|
find_package(Git)
|
||||||
if(GIT_FOUND)
|
if(GIT_FOUND)
|
||||||
|
|||||||
+20
-3
@@ -79,9 +79,6 @@ if(APPLE)
|
|||||||
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.9")
|
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.9")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Set compiler definitions
|
|
||||||
target_compile_definitions(${OLIVE_TARGET} PRIVATE ${OLIVE_DEFINITIONS})
|
|
||||||
|
|
||||||
# Set compiler options
|
# Set compiler options
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
target_compile_options(
|
target_compile_options(
|
||||||
@@ -171,6 +168,26 @@ elseif (APPLE)
|
|||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# Enable Crashpad if found
|
||||||
|
if (GoogleCrashpad_FOUND)
|
||||||
|
set(OLIVE_DEFINITIONS ${OLIVE_DEFINITIONS} USE_CRASHPAD)
|
||||||
|
|
||||||
|
target_include_directories(
|
||||||
|
${OLIVE_TARGET}
|
||||||
|
PRIVATE
|
||||||
|
${CRASHPAD_INCLUDE_DIRS}
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(
|
||||||
|
${OLIVE_TARGET}
|
||||||
|
PRIVATE
|
||||||
|
${CRASHPAD_LIBRARIES}
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Set compiler definitions
|
||||||
|
target_compile_definitions(${OLIVE_TARGET} PRIVATE ${OLIVE_DEFINITIONS})
|
||||||
|
|
||||||
set(OLIVE_TS_FILES
|
set(OLIVE_TS_FILES
|
||||||
# FIXME: Empty variable
|
# FIXME: Empty variable
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -23,6 +23,8 @@ set(OLIVE_SOURCES
|
|||||||
common/clamp.h
|
common/clamp.h
|
||||||
common/crashhandler.h
|
common/crashhandler.h
|
||||||
common/crashhandler.cpp
|
common/crashhandler.cpp
|
||||||
|
common/crashpadinterface.cpp
|
||||||
|
common/crashpadinterface.h
|
||||||
common/debug.h
|
common/debug.h
|
||||||
common/debug.cpp
|
common/debug.cpp
|
||||||
common/define.h
|
common/define.h
|
||||||
|
|||||||
@@ -0,0 +1,82 @@
|
|||||||
|
/***
|
||||||
|
|
||||||
|
Olive - Non-Linear Video Editor
|
||||||
|
Copyright (C) 2019 Olive Team
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
***/
|
||||||
|
|
||||||
|
#include "crashpadinterface.h"
|
||||||
|
|
||||||
|
#ifdef USE_CRASHPAD
|
||||||
|
|
||||||
|
#include <QCoreApplication>
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QDir>
|
||||||
|
|
||||||
|
#include "filefunctions.h"
|
||||||
|
|
||||||
|
// Copied from base::FilePath to match its macro
|
||||||
|
#if defined(OS_POSIX)
|
||||||
|
// On most platforms, native pathnames are char arrays, and the encoding
|
||||||
|
// may or may not be specified. On Mac OS X, native pathnames are encoded
|
||||||
|
// in UTF-8.
|
||||||
|
#define TO_BASE_STRING_TYPE(x) x.toStdString()
|
||||||
|
#elif defined(OS_WIN)
|
||||||
|
// On Windows, for Unicode-aware applications, native pathnames are wchar_t
|
||||||
|
// arrays encoded in UTF-16.
|
||||||
|
#define TO_BASE_STRING_TYPE(x) x.toStdWString()
|
||||||
|
#endif // OS_WIN
|
||||||
|
|
||||||
|
bool InitializeCrashpad()
|
||||||
|
{
|
||||||
|
QString exe_dir = QCoreApplication::applicationDirPath();
|
||||||
|
|
||||||
|
// FIXME: On Linux, probably should put this in a subdir so that it doesn't conflict with
|
||||||
|
// anything else in /usr/bin
|
||||||
|
|
||||||
|
base::FilePath handler(TO_BASE_STRING_TYPE(QDir(exe_dir).filePath(QStringLiteral("crashpad_handler.exe"))));
|
||||||
|
|
||||||
|
base::FilePath reports_dir(TO_BASE_STRING_TYPE(QDir(OLIVE_NAMESPACE::FileFunctions::GetTempFilePath()).filePath("reports")));
|
||||||
|
|
||||||
|
base::FilePath metrics_dir(TO_BASE_STRING_TYPE(QDir(OLIVE_NAMESPACE::FileFunctions::GetTempFilePath()).filePath("metrics")));
|
||||||
|
|
||||||
|
std::string url = "https://olivevideoeditor.org/crashpad/report.php";
|
||||||
|
|
||||||
|
// Metadata that will be posted to the server with the crash report map
|
||||||
|
std::map<std::string, std::string> annotations;
|
||||||
|
|
||||||
|
// Disable crashpad rate limiting so that all crashes have dmp files
|
||||||
|
std::vector<std::string> arguments;
|
||||||
|
arguments.push_back("--no-rate-limit");
|
||||||
|
arguments.push_back("--no-upload-gzip");
|
||||||
|
|
||||||
|
// Initialize Crashpad database
|
||||||
|
std::unique_ptr<crashpad::CrashReportDatabase> database = crashpad::CrashReportDatabase::Initialize(reports_dir);
|
||||||
|
if (database == NULL) return false;
|
||||||
|
|
||||||
|
// Enable automated crash uploads
|
||||||
|
crashpad::Settings *settings = database->GetSettings();
|
||||||
|
if (settings == NULL) return false;
|
||||||
|
settings->SetUploadsEnabled(true);
|
||||||
|
|
||||||
|
// Start crash handler
|
||||||
|
crashpad::CrashpadClient *client = new crashpad::CrashpadClient();
|
||||||
|
bool status = client->StartHandler(handler, reports_dir, metrics_dir,
|
||||||
|
url, annotations, arguments, true, true);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // USE_CRASHPAD
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
/***
|
||||||
|
|
||||||
|
Olive - Non-Linear Video Editor
|
||||||
|
Copyright (C) 2019 Olive Team
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
***/
|
||||||
|
|
||||||
|
#ifndef CRASHPAD_INTERFACE_H
|
||||||
|
#define CRASHPAD_INTERFACE_H
|
||||||
|
|
||||||
|
#ifdef USE_CRASHPAD
|
||||||
|
|
||||||
|
#include <client/crashpad_client.h>
|
||||||
|
#include <client/crash_report_database.h>
|
||||||
|
#include <client/settings.h>
|
||||||
|
|
||||||
|
bool InitializeCrashpad();
|
||||||
|
|
||||||
|
#endif // USE_CRASHPAD
|
||||||
|
|
||||||
|
#endif // CRASHPAD_INTERFACE_H
|
||||||
+12
-4
@@ -32,17 +32,18 @@ extern "C" {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#include <csignal>
|
#include <csignal>
|
||||||
|
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QSurfaceFormat>
|
#include <QSurfaceFormat>
|
||||||
|
|
||||||
#include "core.h"
|
#include "core.h"
|
||||||
#include "common/crashhandler.h"
|
|
||||||
#include "common/debug.h"
|
#include "common/debug.h"
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
#ifdef USE_CRASHPAD
|
||||||
signal(SIGSEGV, OLIVE_NAMESPACE::crash_handler);
|
#include "common/crashpadinterface.h"
|
||||||
signal(SIGABRT, OLIVE_NAMESPACE::crash_handler);
|
#endif // USE_CRASHPAD
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
// Set OpenGL display profile (3.2 Core)
|
// Set OpenGL display profile (3.2 Core)
|
||||||
QSurfaceFormat format;
|
QSurfaceFormat format;
|
||||||
format.setVersion(3, 2);
|
format.setVersion(3, 2);
|
||||||
@@ -86,5 +87,12 @@ int main(int argc, char *argv[]) {
|
|||||||
avfilter_register_all();
|
avfilter_register_all();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Enable Google Crashpad if compiled with it
|
||||||
|
#ifdef USE_CRASHPAD
|
||||||
|
if (!InitializeCrashpad()) {
|
||||||
|
qWarning() << "Failed to initialize Crashpad handler";
|
||||||
|
}
|
||||||
|
#endif // USE_CRASHPAD
|
||||||
|
|
||||||
return OLIVE_NAMESPACE::Core::instance()->execute(&a);
|
return OLIVE_NAMESPACE::Core::instance()->execute(&a);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,82 @@
|
|||||||
|
# Olive - Non-Linear Video Editor
|
||||||
|
# Copyright (C) 2019 Olive Team
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
|
||||||
|
# Try to find include files
|
||||||
|
find_path(CRASHPAD_CLIENT_INCLUDE_DIR
|
||||||
|
client/crashpad_client.h
|
||||||
|
HINTS
|
||||||
|
"${CRASHPAD_LOCATION}"
|
||||||
|
"$ENV{CRASHPAD_LOCATION}"
|
||||||
|
"${CRASHPAD_BASE_DIR}"
|
||||||
|
)
|
||||||
|
list(APPEND CRASHPAD_INCLUDE_DIRS ${CRASHPAD_CLIENT_INCLUDE_DIR})
|
||||||
|
|
||||||
|
find_path(CRASHPAD_BASE_INCLUDE_DIR
|
||||||
|
base/files/file_path.h
|
||||||
|
HINTS
|
||||||
|
"${CRASHPAD_LOCATION}"
|
||||||
|
"$ENV{CRASHPAD_LOCATION}"
|
||||||
|
"${CRASHPAD_BASE_DIR}"
|
||||||
|
PATH_SUFFIXES
|
||||||
|
"third_party/mini_chromium/mini_chromium"
|
||||||
|
)
|
||||||
|
list(APPEND CRASHPAD_INCLUDE_DIRS ${CRASHPAD_BASE_INCLUDE_DIR})
|
||||||
|
|
||||||
|
# Try to find build files
|
||||||
|
if (WIN32)
|
||||||
|
find_path(CRASHPAD_LIBRARY_DIRS
|
||||||
|
obj/client/client.lib
|
||||||
|
HINTS
|
||||||
|
"${CRASHPAD_LOCATION}"
|
||||||
|
"$ENV{CRASHPAD_LOCATION}"
|
||||||
|
"${CRASHPAD_BASE_DIR}"
|
||||||
|
)
|
||||||
|
elseif(UNIX)
|
||||||
|
# Assuming macOS works this way, don't actually know
|
||||||
|
find_path(CRASHPAD_LIBRARY_DIRS
|
||||||
|
obj/client/libclient.a
|
||||||
|
HINTS
|
||||||
|
"${CRASHPAD_LOCATION}"
|
||||||
|
"$ENV{CRASHPAD_LOCATION}"
|
||||||
|
"${CRASHPAD_BASE_DIR}"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Find the libraries we need
|
||||||
|
set (_crashpad_components
|
||||||
|
client/client
|
||||||
|
util/util
|
||||||
|
third_party/mini_chromium/mini_chromium/base/base)
|
||||||
|
foreach (COMPONENT ${_crashpad_components})
|
||||||
|
string(REGEX MATCH "^(.*[\\\/])" SUBDIR ${COMPONENT})
|
||||||
|
string(REGEX MATCH "([^\/]+$)" SHORT_COMPONENT ${COMPONENT})
|
||||||
|
string(TOUPPER ${SHORT_COMPONENT} UPPERCOMPONENT)
|
||||||
|
|
||||||
|
find_library(CRASHPAD_${UPPERCOMPONENT}_LIB
|
||||||
|
${SHORT_COMPONENT}
|
||||||
|
HINTS "${CRASHPAD_LIBRARY_DIRS}/obj/${SUBDIR}"
|
||||||
|
)
|
||||||
|
|
||||||
|
list(APPEND CRASHPAD_LIBRARIES ${CRASHPAD_${UPPERCOMPONENT}_LIB})
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
find_package_handle_standard_args(GoogleCrashpad
|
||||||
|
REQUIRED_VARS
|
||||||
|
CRASHPAD_LIBRARIES
|
||||||
|
CRASHPAD_INCLUDE_DIRS
|
||||||
|
)
|
||||||
Reference in New Issue
Block a user