Skip to content

Commit

Permalink
deps: replace breakpad with sentry-native
Browse files Browse the repository at this point in the history
  • Loading branch information
scribam committed Nov 25, 2024
1 parent da3cfd9 commit 06a53bc
Show file tree
Hide file tree
Showing 14 changed files with 116 additions and 367 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/android.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ jobs:
working-directory: shell/android-studio
run: ./gradlew assembleRelease bundleRelease --parallel
env:
SENTRY_UPLOAD_URL: ${{ secrets.SENTRY_UPLOAD_URL }}
SENTRY_DSN: ${{ secrets.SENTRY_UPLOAD_URL }}
ANDROID_KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}

- uses: actions/upload-artifact@v4
Expand Down
6 changes: 3 additions & 3 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,6 @@
[submodule "core/deps/luabridge"]
path = core/deps/luabridge
url = https://github.com/vinniefalco/LuaBridge.git
[submodule "core/deps/breakpad"]
path = core/deps/breakpad
url = https://github.com/flyinghead/mingw-breakpad
[submodule "core/deps/Vulkan-Headers"]
path = core/deps/Vulkan-Headers
url = https://github.com/KhronosGroup/Vulkan-Headers.git
Expand Down Expand Up @@ -41,3 +38,6 @@
[submodule "core/deps/googletest"]
path = core/deps/googletest
url = https://github.com/google/googletest.git
[submodule "core/deps/sentry-native"]
path = core/deps/sentry-native
url = https://github.com/getsentry/sentry-native.git
95 changes: 9 additions & 86 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@ if(CCACHE_PROGRAM)
set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE_PROGRAM} CACHE STRING "Compiler launcher for CXX.")
endif()

set(SENTRY_UPLOAD_URL "" CACHE STRING "Sentry upload URL")

set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/shell/cmake")

if(APPLE)
Expand Down Expand Up @@ -254,10 +252,6 @@ if(UNIX AND NOT ANDROID AND NOT APPLE)
target_compile_definitions(${PROJECT_NAME} PRIVATE PAGE_SIZE=${PAGE_SIZE})
endif()

if(NOT "${SENTRY_UPLOAD_URL}" STREQUAL "")
target_compile_definitions(${PROJECT_NAME} PRIVATE SENTRY_UPLOAD="${SENTRY_UPLOAD_URL}")
endif()

target_include_directories(${PROJECT_NAME} PRIVATE core core/deps core/deps/stb core/deps/json)
if(LIBRETRO)
target_include_directories(${PROJECT_NAME} PRIVATE shell/libretro)
Expand All @@ -267,88 +261,17 @@ if(NINTENDO_SWITCH)
endif()

if(USE_BREAKPAD AND NOT LIBRETRO)
find_program(SH_EXECUTABLE sh)
if((ANDROID AND NOT CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows") OR (MINGW AND SH_EXECUTABLE) OR (CMAKE_SYSTEM_NAME STREQUAL "Linux"))
add_subdirectory(core/deps/breakpad)
if(WIN32)
target_link_options(${PROJECT_NAME} PRIVATE "-Wl,--build-id")
if(NOT ANDROID AND NOT CMAKE_SYSTEM_NAME MATCHES "(FreeBSD|OpenBSD|NetBSD)" AND NOT IOS AND NOT NINTENDO_SWITCH)
set(SENTRY_UPLOAD_URL "" CACHE STRING "Sentry upload URL")
if(NOT "${SENTRY_UPLOAD_URL}" STREQUAL "")
target_compile_definitions(${PROJECT_NAME} PRIVATE SENTRY_UPLOAD="${SENTRY_UPLOAD_URL}")
endif()
target_link_libraries(${PROJECT_NAME} PUBLIC breakpad_client)
target_compile_definitions(${PROJECT_NAME} PRIVATE USE_BREAKPAD)
elseif(APPLE AND NOT IOS)
target_sources(${PROJECT_NAME} PRIVATE
core/deps/breakpad/src/client/minidump_file_writer-inl.h
core/deps/breakpad/src/client/minidump_file_writer.cc
core/deps/breakpad/src/client/minidump_file_writer.h
core/deps/breakpad/src/client/mac/handler/breakpad_nlist_64.cc
core/deps/breakpad/src/client/mac/handler/breakpad_nlist_64.h
core/deps/breakpad/src/client/mac/handler/dynamic_images.cc
core/deps/breakpad/src/client/mac/handler/dynamic_images.h
core/deps/breakpad/src/client/mac/handler/exception_handler.cc
core/deps/breakpad/src/client/mac/handler/exception_handler.h
core/deps/breakpad/src/client/mac/handler/minidump_generator.cc
core/deps/breakpad/src/client/mac/handler/minidump_generator.h
core/deps/breakpad/src/client/mac/handler/protected_memory_allocator.cc
core/deps/breakpad/src/client/mac/handler/protected_memory_allocator.h
core/deps/breakpad/src/client/mac/crash_generation/ConfigFile.h
core/deps/breakpad/src/client/mac/crash_generation/ConfigFile.mm
core/deps/breakpad/src/client/mac/crash_generation/client_info.h
core/deps/breakpad/src/client/mac/crash_generation/crash_generation_client.h
core/deps/breakpad/src/client/mac/crash_generation/crash_generation_client.cc
core/deps/breakpad/src/common/convert_UTF.cc
core/deps/breakpad/src/common/convert_UTF.h
core/deps/breakpad/src/common/md5.cc
core/deps/breakpad/src/common/string_conversion.cc
core/deps/breakpad/src/common/string_conversion.h
core/deps/breakpad/src/common/mac/file_id.cc
core/deps/breakpad/src/common/mac/file_id.h
core/deps/breakpad/src/common/mac/MachIPC.mm
core/deps/breakpad/src/common/mac/MachIPC.h
core/deps/breakpad/src/common/mac/bootstrap_compat.cc
core/deps/breakpad/src/common/mac/bootstrap_compat.h
core/deps/breakpad/src/common/mac/macho_id.cc
core/deps/breakpad/src/common/mac/macho_id.h
core/deps/breakpad/src/common/mac/macho_utilities.cc
core/deps/breakpad/src/common/mac/macho_utilities.h
core/deps/breakpad/src/common/mac/macho_walker.cc
core/deps/breakpad/src/common/mac/macho_walker.h
core/deps/breakpad/src/common/mac/string_utilities.cc
core/deps/breakpad/src/common/mac/string_utilities.h
)
target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/core/deps/breakpad/src)
target_compile_definitions(${PROJECT_NAME} PRIVATE USE_BREAKPAD)
add_custom_target(dump_syms COMMAND xcodebuild -project ${CMAKE_CURRENT_SOURCE_DIR}/core/deps/breakpad/src/tools/mac/dump_syms/dump_syms.xcodeproj -target dump_syms -configuration Release CONFIGURATION_BUILD_DIR=${CMAKE_CURRENT_SOURCE_DIR}/build/breakpad)
ADD_DEPENDENCIES(${PROJECT_NAME} dump_syms)

if(${CMAKE_GENERATOR} MATCHES "^Xcode.*")
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND sleep 20
COMMAND mkdir -p ../symbols
COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build/breakpad/dump_syms
-a x86_64
-g ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/Flycast.app.dSYM
$<TARGET_FILE:flycast> > ../symbols/Flycast-x64.sym
COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build/breakpad/dump_syms
-a arm64
-g ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/Flycast.app.dSYM
$<TARGET_FILE:flycast> > ../symbols/Flycast-arm64.sym
)
else()
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND sleep 20
COMMAND mkdir -p ../symbols
COMMAND dsymutil $<TARGET_FILE:flycast>
-o ${CMAKE_CURRENT_BINARY_DIR}/Flycast.app.dSYM
COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build/breakpad/dump_syms
-a x86_64
-g ${CMAKE_CURRENT_BINARY_DIR}/Flycast.app.dSYM
$<TARGET_FILE:flycast> > ../symbols/Flycast-x64.sym
COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build/breakpad/dump_syms
-a arm64
-g ${CMAKE_CURRENT_BINARY_DIR}/Flycast.app.dSYM
$<TARGET_FILE:flycast> > ../symbols/Flycast-arm64.sym
)
endif()
set(SENTRY_BACKEND "breakpad")
set(SENTRY_BUILD_SHARED_LIBS OFF)
add_subdirectory(core/deps/sentry-native)
target_compile_definitions(${PROJECT_NAME} PRIVATE USE_SENTRY_NATIVE)
target_link_libraries(${PROJECT_NAME} PRIVATE sentry::sentry)
endif()
endif()

Expand Down
1 change: 0 additions & 1 deletion core/deps/breakpad
Submodule breakpad deleted from 1ab24b
1 change: 1 addition & 0 deletions core/deps/sentry-native
Submodule sentry-native added at a2bd91
27 changes: 8 additions & 19 deletions core/linux-dist/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@
#include "sdl/sdl.h"
#endif

#ifdef USE_BREAKPAD
#include "breakpad/client/linux/handler/exception_handler.h"
#ifdef USE_SENTRY_NATIVE
#include <sentry.h>
#endif

void os_DoEvents()
Expand Down Expand Up @@ -219,22 +219,11 @@ void os_RunInstance(int argc, const char *argv[])
}
}

#if defined(USE_BREAKPAD)
static bool dumpCallback(const google_breakpad::MinidumpDescriptor& descriptor, void* context, bool succeeded)
{
if (succeeded)
registerCrash(descriptor.directory().c_str(), descriptor.path());

return succeeded;
}
#endif

int main(int argc, char* argv[])
{
selfPath = argv[0];
#if defined(USE_BREAKPAD)
google_breakpad::MinidumpDescriptor descriptor("/tmp");
google_breakpad::ExceptionHandler eh(descriptor, nullptr, dumpCallback, nullptr, true, -1);
#ifdef USE_SENTRY_NATIVE
// TODO: init sentry
#endif

LogManager::Init();
Expand Down Expand Up @@ -262,15 +251,15 @@ int main(int argc, char* argv[])
if (flycast_init(argc, argv))
die("Flycast initialization failed\n");

#if defined(USE_BREAKPAD)
auto async = std::async(std::launch::async, uploadCrashes, "/tmp");
#endif

mainui_loop();

flycast_term();
os_UninstallFaultHandler();

#ifdef USE_SENTRY_NATIVE
sentry_close();
#endif

return 0;
}

Expand Down
122 changes: 0 additions & 122 deletions core/oslib/oslib.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -347,125 +347,3 @@ void os_UpdateInputState()
#endif
#endif
}

#ifdef USE_BREAKPAD

#include "http_client.h"
#include "version.h"
#include "log/InMemoryListener.h"
#include "wsi/context.h"

#define FLYCAST_CRASH_LIST "flycast-crashes.txt"

void registerCrash(const char *directory, const char *path)
{
char list[256];
// Register .dmp in crash list
snprintf(list, sizeof(list), "%s/%s", directory, FLYCAST_CRASH_LIST);
FILE *f = nowide::fopen(list, "at");
if (f != nullptr)
{
fprintf(f, "%s\n", path);
fclose(f);
}
// Save last log lines
InMemoryListener *listener = InMemoryListener::getInstance();
if (listener != nullptr)
{
strncpy(list, path, sizeof(list) - 1);
list[sizeof(list) - 1] = '\0';
char *p = strrchr(list, '.');
if (p != nullptr && (p - list) < (int)sizeof(list) - 4)
{
strcpy(p + 1, "log");
FILE *f = nowide::fopen(list, "wt");
if (f != nullptr)
{
std::vector<std::string> log = listener->getLog();
for (const auto& line : log)
fprintf(f, "%s", line.c_str());
fprintf(f, "Version: %s\n", GIT_VERSION);
fprintf(f, "Renderer: %d\n", (int)config::RendererType.get());
GraphicsContext *gctx = GraphicsContext::Instance();
if (gctx != nullptr)
fprintf(f, "GPU: %s %s\n", gctx->getDriverName().c_str(), gctx->getDriverVersion().c_str());
fprintf(f, "Game: %s\n", settings.content.gameId.c_str());
fclose(f);
}
}
}
}

void uploadCrashes(const std::string& directory)
{
FILE *f = nowide::fopen((directory + "/" FLYCAST_CRASH_LIST).c_str(), "rt");
if (f == nullptr)
return;
http::init();
char line[256];
bool uploadFailure = false;
while (fgets(line, sizeof(line), f) != nullptr)
{
char *p = line + strlen(line) - 1;
if (*p == '\n')
*p = '\0';
if (file_exists(line))
{
std::string dmpfile(line);
std::string logfile = get_file_basename(dmpfile) + ".log";
#ifdef SENTRY_UPLOAD
if (config::UploadCrashLogs)
{
NOTICE_LOG(COMMON, "Uploading minidump %s", line);
std::string version = std::string(GIT_VERSION);
if (file_exists(logfile))
{
nowide::ifstream ifs(logfile);
if (ifs.is_open())
{
std::string line;
while (std::getline(ifs, line))
if (line.substr(0, 9) == "Version: ")
{
version = line.substr(9);
break;
}
}
}
std::vector<http::PostField> fields;
fields.emplace_back("upload_file_minidump", dmpfile, "application/octet-stream");
fields.emplace_back("sentry[release]", version);
if (file_exists(logfile))
fields.emplace_back("flycast_log", logfile, "text/plain");
// TODO config, gpu/driver, ...
int rc = http::post(SENTRY_UPLOAD, fields);
if (rc >= 200 && rc < 300) {
nowide::remove(dmpfile.c_str());
nowide::remove(logfile.c_str());
}
else
{
WARN_LOG(COMMON, "Upload failed: HTTP error %d", rc);
uploadFailure = true;
}
}
else
#endif
{
nowide::remove(dmpfile.c_str());
nowide::remove(logfile.c_str());
}
}
}
http::term();
fclose(f);
if (!uploadFailure)
nowide::remove((directory + "/" FLYCAST_CRASH_LIST).c_str());
}

#else

void registerCrash(const char *directory, const char *path) {}
void uploadCrashes(const std::string& directory) {}

#endif
Loading

0 comments on commit 06a53bc

Please sign in to comment.