feature add sentry for soft catch dmp

This commit is contained in:
alves
2025-12-03 09:27:09 +08:00
parent b28f1f2de4
commit 9cb538956d
12 changed files with 377 additions and 148 deletions
+11
View File
@@ -150,3 +150,14 @@ jobs:
os: ${{ inputs.os }} os: ${{ inputs.os }}
arch: ${{ inputs.arch }} arch: ${{ inputs.arch }}
secrets: inherit secrets: inherit
upload_symbols:
name: Upload Debug Symbols to Sentry
needs: [build_orca]
if: ${{ !cancelled() && needs.build_orca.result == 'success' }}
uses: ./.github/workflows/sentry_cli.yml
with:
os: ${{ inputs.os }}
pdb-artifact-name: PDB
release: ${{ github.sha }}
secrets: inherit
+17
View File
@@ -18,6 +18,8 @@ jobs:
build_orca: build_orca:
name: Build Snapmaker_Orca name: Build Snapmaker_Orca
runs-on: ${{ inputs.os }} runs-on: ${{ inputs.os }}
outputs:
release: ${{ steps.set_release.outputs.release || steps.set_release_win.outputs.release }}
env: env:
date: date:
ver: ver:
@@ -77,6 +79,21 @@ jobs:
echo "date: ${{ env.date }} version: ${{ env.ver }}" echo "date: ${{ env.date }} version: ${{ env.ver }}"
shell: pwsh shell: pwsh
- name: Set release output (non-Windows)
id: set_release
if: inputs.os != 'windows-latest'
run: |
echo "release=$ver" >> $GITHUB_OUTPUT
shell: bash
- name: Set release output (Windows)
id: set_release_win
if: inputs.os == 'windows-latest'
run: |
$release = $env:ver
Write-Output ("release=$release") | Out-File -Append -FilePath $env:GITHUB_OUTPUT -Encoding utf8
shell: pwsh
# Mac # Mac
- name: Install tools mac - name: Install tools mac
if: inputs.os == 'macos-14' if: inputs.os == 'macos-14'
+57
View File
@@ -0,0 +1,57 @@
name: Upload Debug Symbols to Sentry
on:
workflow_call:
inputs:
os:
required: true
type: string
description: "Target OS: windows-latest, macos-14, ubuntu-20.04, ubuntu-24.04"
pdb-artifact-name:
required: false
type: string
description: "Artifact name for Windows PDB archive (e.g., 'PDB')"
release:
required: true
type: string
description: "Release version/tag"
jobs:
upload_symbols:
name: Upload Debug Symbols to Sentry
runs-on: ${{ inputs.os }}
steps:
# ==================== Windows ====================
- name: "[Windows] Install sentry-cli via choco"
if: inputs.os == 'windows-latest'
shell: pwsh
run: |
choco install sentry-cli -y -y 2>&1 | Out-Null
- name: "[Windows] Download PDB artifact"
if: inputs.os == 'windows-latest'
uses: actions/download-artifact@v4
with:
name: ${{ inputs.pdb-artifact-name }}
path: ./symbols
- name: "[Windows] Upload PDB to Sentry (sentry-cli)"
if: inputs.os == 'windows-latest'
shell: pwsh
env:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
run: |
$pdbArchive = Get-ChildItem -Path ./symbols -Filter "*.7z" -File | Select-Object -First 1
if ($pdbArchive) {
Write-Host "Uploading PDB archive: $($pdbArchive.FullName)"
sentry-cli.exe --auth-token $env:SENTRY_AUTH_TOKEN upload-dif --org "${{ secrets.SENTRY_ORG }}" --project "${{ secrets.SENTRY_PROJECT }}" "$($pdbArchive.FullName)" 2>&1 | Out-Host
} else {
Write-Host "No PDB archive found in symbols folder"
exit 1
}
# ==================== macOS ====================
# ==================== Linux ====================
+27
View File
@@ -534,6 +534,7 @@ find_package(TBB REQUIRED)
find_package(OpenSSL REQUIRED) find_package(OpenSSL REQUIRED)
find_package(CURL REQUIRED) find_package(CURL REQUIRED)
find_package(Sentry REQUIRED)
find_package(Freetype REQUIRED) find_package(Freetype REQUIRED)
@@ -543,6 +544,22 @@ target_link_libraries(libcurl INTERFACE CURL::libcurl)
find_package(ZLIB REQUIRED) find_package(ZLIB REQUIRED)
target_link_libraries(libcurl INTERFACE ZLIB::ZLIB) target_link_libraries(libcurl INTERFACE ZLIB::ZLIB)
add_library(sentry INTERFACE)
target_link_libraries(sentry INTERFACE sentry::sentry)
# Add sentry library directory and link sentry.lib explicitly for Windows
if (WIN32 AND CMAKE_PREFIX_PATH)
# Try to find sentry.lib in the install prefix
file(GLOB _sentry_lib "${CMAKE_PREFIX_PATH}/lib/sentry.lib")
if (_sentry_lib)
target_link_directories(sentry INTERFACE "${CMAKE_PREFIX_PATH}/lib")
target_link_libraries(sentry INTERFACE "sentry.lib")
message(STATUS "Found sentry.lib at: ${CMAKE_PREFIX_PATH}/lib")
else()
message(WARNING "sentry.lib not found in ${CMAKE_PREFIX_PATH}/lib. Sentry SDK may not have been built yet.")
endif()
endif()
# Fixing curl's cmake config script bugs # Fixing curl's cmake config script bugs
if (NOT WIN32) if (NOT WIN32)
# Required by libcurl # Required by libcurl
@@ -727,6 +744,14 @@ function(Snapmaker_Orca_copy_dlls target config postfix output_dlls)
${TOP_LEVEL_PROJECT_DIR}/deps/WebView2/lib/win-${_arch}/WebView2Loader.dll ${TOP_LEVEL_PROJECT_DIR}/deps/WebView2/lib/win-${_arch}/WebView2Loader.dll
DESTINATION ${_out_dir}) DESTINATION ${_out_dir})
# Copy Sentry and Crashpad artifacts if they were built by deps
if (EXISTS "${CMAKE_PREFIX_PATH}/bin/sentry.dll")
file(COPY "${CMAKE_PREFIX_PATH}/bin/sentry.dll"
"${CMAKE_PREFIX_PATH}/bin/crashpad_handler.exe"
DESTINATION ${_out_dir}
)
endif()
file(COPY ${CMAKE_PREFIX_PATH}/bin/occt/TKBO.dll file(COPY ${CMAKE_PREFIX_PATH}/bin/occt/TKBO.dll
${CMAKE_PREFIX_PATH}/bin/occt/TKBRep.dll ${CMAKE_PREFIX_PATH}/bin/occt/TKBRep.dll
${CMAKE_PREFIX_PATH}/bin/occt/TKCAF.dll ${CMAKE_PREFIX_PATH}/bin/occt/TKCAF.dll
@@ -789,6 +814,8 @@ function(Snapmaker_Orca_copy_dlls target config postfix output_dlls)
${_out_dir}/TKXSBase.dll ${_out_dir}/TKXSBase.dll
${_out_dir}/freetype.dll ${_out_dir}/freetype.dll
${_out_dir}/sentry.dll
${_out_dir}/crashpad_handler.exe
PARENT_SCOPE PARENT_SCOPE
) )
+7
View File
@@ -314,6 +314,12 @@ if (NOT OPENSSL_FOUND OR NOT CURL_FOUND)
set(CURL_PKG dep_CURL) set(CURL_PKG dep_CURL)
endif () endif ()
set(SENTRY_PKG "")
if (NOT SENTRY_FOUND)
include(Sentry/Sentry.cmake)
set(SENTRY_PKG dep_Sentry)
endif()
set(JPEG_PKG "") set(JPEG_PKG "")
if (NOT JPEG_FOUND) if (NOT JPEG_FOUND)
include(JPEG/JPEG.cmake) include(JPEG/JPEG.cmake)
@@ -355,6 +361,7 @@ set(_dep_list
dep_TBB dep_TBB
${OPENSSL_PKG} ${OPENSSL_PKG}
${CURL_PKG} ${CURL_PKG}
${SENTRY_PKG}
${WXWIDGETS_PKG} ${WXWIDGETS_PKG}
dep_Cereal dep_Cereal
dep_NLopt dep_NLopt
+63
View File
@@ -0,0 +1,63 @@
set(_sentry_platform_flags
-DCMAKE_POSITION_INDEPENDENT_CODE=ON
-DSENTRY_BUILD_TESTS=OFF
-DSENTRY_EXAMPLES=OFF
-DSENTRY_CRASHPAD_BACKEND=ON
-DSENTRY_ENABLE_INSTALL=ON
)
# Platform-specific CMake generator and flags
set(_sentry_cmake_generator "")
set(_sentry_build_config "Release")
if (WIN32)
# Windows: build shared libs so we get sentry.dll
set(_sentry_platform_flags ${_sentry_platform_flags}
-DSENTRY_TRANSPORT_WINHTTP=ON
-DSENTRY_BUILD_SHARED_LIBS=ON
-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo
-DCMAKE_C_FLAGS_RELWITHDEBINFO:STRING=/Zi /O2
-DCMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=/Zi /O2
-DCMAKE_EXE_LINKER_FLAGS:STRING=/DEBUG
-DCMAKE_SHARED_LINKER_FLAGS:STRING=/DEBUG
)
if (MSVC)
set(_sentry_cmake_generator -G "Visual Studio 17 2022")
endif()
elseif (APPLE)
# macOS: Use Unix Makefiles (install will put libs in ${DESTDIR}/bin or lib)
set(_sentry_platform_flags
${_sentry_platform_flags}
-DSENTRY_TRANSPORT_CURL=ON
-DSENTRY_BUILD_SHARED_LIBS=OFF
-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo
-DCMAKE_C_FLAGS:STRING=-g -O2
-DCMAKE_CXX_FLAGS:STRING=-g -O2
)
set(_sentry_cmake_generator -G "Unix Makefiles")
elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
# Linux: Use Unix Makefiles
set(_sentry_platform_flags
${_sentry_platform_flags}
-DSENTRY_TRANSPORT_CURL=ON
-DSENTRY_BUILD_SHARED_LIBS=OFF
-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo
-DCMAKE_C_FLAGS:STRING=-g -O2
-DCMAKE_CXX_FLAGS:STRING=-g -O2
)
set(_sentry_cmake_generator -G "Unix Makefiles")
endif ()
Snapmaker_Orca_add_cmake_project(Sentry
GIT_REPOSITORY https://github.com/getsentry/sentry-native.git
GIT_TAG 0.12.1
PATCH_COMMAND ${GIT_EXECUTABLE} submodule update --init --recursive && ${CMAKE_COMMAND} -S external/crashpad -B external/crashpad/build ${_sentry_cmake_generator} -DCMAKE_BUILD_TYPE=Release && ${CMAKE_COMMAND} --build external/crashpad/build --config Release
CMAKE_ARGS
${_sentry_cmake_generator}
-DCMAKE_INSTALL_DATADIR:STRING=share
${_sentry_platform_flags}
)
if (MSVC)
add_debug_dep(dep_Sentry)
endif ()
+1 -1
View File
@@ -183,7 +183,7 @@ if (WIN32)
target_compile_definitions(Snapmaker_Orca_app_gui PRIVATE -DSLIC3R_WRAPPER_NOCONSOLE) target_compile_definitions(Snapmaker_Orca_app_gui PRIVATE -DSLIC3R_WRAPPER_NOCONSOLE)
add_dependencies(Snapmaker_Orca_app_gui Snapmaker_Orca) add_dependencies(Snapmaker_Orca_app_gui Snapmaker_Orca)
set_target_properties(Snapmaker_Orca_app_gui PROPERTIES OUTPUT_NAME "snapmaker-orca") set_target_properties(Snapmaker_Orca_app_gui PROPERTIES OUTPUT_NAME "snapmaker-orca")
target_link_libraries(Snapmaker_Orca_app_gui PRIVATE boost_headeronly) target_link_libraries(Snapmaker_Orca_app_gui PRIVATE boost_headeronly sentry::sentry)
endif () endif ()
# Link the resources dir to where Slic3r GUI expects it # Link the resources dir to where Slic3r GUI expects it
-64
View File
@@ -6268,63 +6268,6 @@ std::string CLI::output_filepath(const ModelObject &object, unsigned int index,
} }
//BBS: dump stack debug codes, don't delete currently
//#include <dbghelp.h>
//#pragma comment(lib, "version.lib")
//#pragma comment( lib, "dbghelp.lib" )
/*DWORD main_thread_id;
std::string TraceStack()
{
static const int MAX_STACK_FRAMES = 16;
void* pStack[MAX_STACK_FRAMES];
HANDLE process = GetCurrentProcess();
SymInitialize(process, NULL, TRUE);
WORD frames = CaptureStackBackTrace(0, MAX_STACK_FRAMES, pStack, NULL);
std::ostringstream oss;
oss << "stack traceback: frames="<< frames << std::endl;
for (WORD i = 0; i < frames; ++i) {
DWORD64 address = (DWORD64)(pStack[i]);
DWORD64 displacementSym = 0;
char buffer[sizeof(SYMBOL_INFO) + MAX_SYM_NAME * sizeof(TCHAR)];
PSYMBOL_INFO pSymbol = (PSYMBOL_INFO)buffer;
pSymbol->SizeOfStruct = sizeof(SYMBOL_INFO);
pSymbol->MaxNameLen = MAX_SYM_NAME;
DWORD displacementLine = 0;
IMAGEHLP_LINE64 line;
//SymSetOptions(SYMOPT_LOAD_LINES);
line.SizeOfStruct = sizeof(IMAGEHLP_LINE64);
if (SymFromAddr(process, address, &displacementSym, pSymbol)
&& SymGetLineFromAddr64(process, address, &displacementLine, &line)) {
oss << "\t" << pSymbol->Name << " at " << line.FileName << ":" << line.LineNumber << "(0x" << std::hex << pSymbol->Address << std::dec << ")" << std::endl;
}
else {
oss << "\terror: " << GetLastError() << std::endl;
}
}
return oss.str();
}
LONG WINAPI VectoredExceptionHandler(PEXCEPTION_POINTERS pExceptionInfo)
{
std::ofstream f;
DWORD cur_thread_id = GetCurrentThreadId();
f.open("VectoredExceptionHandler.txt", std::ios::out | std::ios::app);
f << "main thread id="<<main_thread_id<<", current thread_id="<< cur_thread_id << std::endl;
f << std::hex << pExceptionInfo->ExceptionRecord->ExceptionCode << std::endl;
f << TraceStack();
f.flush();
f.close();
return EXCEPTION_CONTINUE_SEARCH;
}*/
#if defined(_MSC_VER) || defined(__MINGW32__) #if defined(_MSC_VER) || defined(__MINGW32__)
extern "C" { extern "C" {
__declspec(dllexport) int __stdcall Snapmaker_Orca_main(int argc, wchar_t **argv) __declspec(dllexport) int __stdcall Snapmaker_Orca_main(int argc, wchar_t **argv)
@@ -6337,13 +6280,6 @@ extern "C" {
for (size_t i = 0; i < argc; ++ i) for (size_t i = 0; i < argc; ++ i)
argv_ptrs[i] = argv_narrow[i].data(); argv_ptrs[i] = argv_narrow[i].data();
//BBS: register default exception handler
#if BBL_RELEASE_TO_PUBLIC
SET_DEFULTER_HANDLER();
#else
//AddVectoredExceptionHandler(1, CBaseException::UnhandledExceptionFilter);
SET_DEFULTER_HANDLER();
#endif
std::set_new_handler([]() { std::set_new_handler([]() {
int *a = nullptr; int *a = nullptr;
*a = 0; *a = 0;
+133 -25
View File
@@ -6,12 +6,11 @@
#include <Windows.h> #include <Windows.h>
#include <shellapi.h> #include <shellapi.h>
#include <wchar.h> #include <wchar.h>
#include <shlobj.h>
#include "sentry.h"
#ifdef SLIC3R_GUI #ifdef SLIC3R_GUI
extern "C" extern "C" {
{
// Let the NVIDIA and AMD know we want to use their graphics card // Let the NVIDIA and AMD know we want to use their graphics card
// on a dual graphics card system. // on a dual graphics card system.
__declspec(dllexport) DWORD NvOptimusEnablement = 0x00000000; __declspec(dllexport) DWORD NvOptimusEnablement = 0x00000000;
@@ -31,9 +30,18 @@ extern "C"
#include <boost/algorithm/string/split.hpp> #include <boost/algorithm/string/split.hpp>
#include <boost/algorithm/string/classification.hpp> #include <boost/algorithm/string/classification.hpp>
#include <boost/asio/ip/host_name.hpp>
#include <stdio.h> #include <stdio.h>
static sentry_value_t on_crash_callback(const sentry_ucontext_t* uctx, sentry_value_t event, void* closure)
{
(void) uctx;
(void) closure;
// tell the backend to retain the event
return event;
}
#ifdef SLIC3R_GUI #ifdef SLIC3R_GUI
class OpenGLVersionCheck class OpenGLVersionCheck
{ {
@@ -56,7 +64,8 @@ public:
wc.lpszClassName = L"Snapmaker_Orca_opengl_version_check"; wc.lpszClassName = L"Snapmaker_Orca_opengl_version_check";
wc.style = CS_OWNDC; wc.style = CS_OWNDC;
if (RegisterClass(&wc)) { if (RegisterClass(&wc)) {
HWND hwnd = CreateWindowW(wc.lpszClassName, L"Snapmaker_Orca_opengl_version_check", WS_OVERLAPPEDWINDOW, 0, 0, 640, 480, 0, 0, wc.hInstance, (LPVOID)this); HWND hwnd = CreateWindowW(wc.lpszClassName, L"Snapmaker_Orca_opengl_version_check", WS_OVERLAPPEDWINDOW, 0, 0, 640, 480, 0, 0,
wc.hInstance, (LPVOID) this);
if (hwnd) { if (hwnd) {
message_pump_exit = false; message_pump_exit = false;
while (GetMessage(&msg, NULL, 0, 0) > 0 && !message_pump_exit) while (GetMessage(&msg, NULL, 0, 0) > 0 && !message_pump_exit)
@@ -130,25 +139,32 @@ protected:
return; return;
} }
PIXELFORMATDESCRIPTOR pfd = PIXELFORMATDESCRIPTOR pfd = {sizeof(PIXELFORMATDESCRIPTOR),
{
sizeof(PIXELFORMATDESCRIPTOR),
1, 1,
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA, // The kind of framebuffer. RGBA or palette. PFD_TYPE_RGBA, // The kind of framebuffer. RGBA or palette.
32, // Color depth of the framebuffer. 32, // Color depth of the framebuffer.
0, 0, 0, 0, 0, 0,
0, 0,
0, 0,
0, 0,
0, 0, 0, 0, 0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
24, // Number of bits for the depthbuffer 24, // Number of bits for the depthbuffer
8, // Number of bits for the stencilbuffer 8, // Number of bits for the stencilbuffer
0, // Number of Aux buffers in the framebuffer. 0, // Number of Aux buffers in the framebuffer.
PFD_MAIN_PLANE, PFD_MAIN_PLANE,
0, 0,
0, 0, 0 0,
}; 0,
0};
HDC ourWindowHandleToDeviceContext = ::GetDC(hWnd); HDC ourWindowHandleToDeviceContext = ::GetDC(hWnd);
// Gdi32.dll // Gdi32.dll
@@ -180,21 +196,16 @@ protected:
static LRESULT CALLBACK supports_opengl2_wndproc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) static LRESULT CALLBACK supports_opengl2_wndproc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{ {
switch(message) switch (message) {
{ case WM_CREATE: {
case WM_CREATE:
{
CREATESTRUCT* pCreate = reinterpret_cast<CREATESTRUCT*>(lParam); CREATESTRUCT* pCreate = reinterpret_cast<CREATESTRUCT*>(lParam);
OpenGLVersionCheck* ogl_data = reinterpret_cast<OpenGLVersionCheck*>(pCreate->lpCreateParams); OpenGLVersionCheck* ogl_data = reinterpret_cast<OpenGLVersionCheck*>(pCreate->lpCreateParams);
ogl_data->check(hWnd); ogl_data->check(hWnd);
DestroyWindow(hWnd); DestroyWindow(hWnd);
return 0; return 0;
} }
case WM_NCDESTROY: case WM_NCDESTROY: message_pump_exit = true; return 0;
message_pump_exit = true; default: return DefWindowProc(hWnd, message, wParam, lParam);
return 0;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
} }
} }
}; };
@@ -207,6 +218,91 @@ extern "C" {
Slic3rMainFunc Snapmaker_Orca_main = nullptr; Slic3rMainFunc Snapmaker_Orca_main = nullptr;
} }
void initSentry()
{
sentry_options_t* options = sentry_options_new();
{
#ifdef WIN32
std::string dsn = std::string("https://c74b617c2aedc291444d3a238d23e780@o4508125599563776.ingest.us.sentry.io/4510425163956224");
sentry_options_set_dsn(options, dsn.c_str());
wchar_t exeDir[MAX_PATH];
::GetModuleFileNameW(nullptr, exeDir, MAX_PATH);
std::wstring wsExeDir(exeDir);
int nPos = wsExeDir.find_last_of('\\');
std::wstring wsDmpDir = wsExeDir.substr(0, nPos + 1);
std::wstring handlerDir = wsDmpDir + L"crashpad_handler.exe";
wsDmpDir += L"dump";
auto wstringTostring = [](std::wstring wTmpStr) -> std::string {
std::string resStr = std::string();
int len = WideCharToMultiByte(CP_UTF8, 0, wTmpStr.c_str(), -1, nullptr, 0, nullptr, nullptr);
if (len <= 0)
return std::string();
std::string desStr(len, 0);
WideCharToMultiByte(CP_UTF8, 0, wTmpStr.c_str(), -1, &desStr[0], len, nullptr, nullptr);
resStr = desStr;
return resStr;
};
std::string desDir = wstringTostring(handlerDir);
if (!desDir.empty())
sentry_options_set_handler_path(options, desDir.c_str());
desDir = wstringTostring(wsDmpDir);
desDir = wstringTostring(wsDmpDir);
wchar_t appDataPath[MAX_PATH] = {0};
auto hr = SHGetFolderPathW(NULL, CSIDL_LOCAL_APPDATA, NULL, SHGFP_TYPE_CURRENT, appDataPath);
char* path = new char[MAX_PATH];
size_t pathLength;
wcstombs_s(&pathLength, path, MAX_PATH, appDataPath, MAX_PATH);
std::string filePath = path;
std::string appName = "\\" + std::string("Snapmaker_Orca\\");
filePath = filePath + appName;
if (!filePath.empty())
sentry_options_set_database_path(options, filePath.c_str());
#endif
std::string softVersion = "snapmaker_orca_2.2.0_beta2";
// Snapmaker_VERSION
sentry_options_set_release(options, softVersion.c_str());
#if defined(_DEBUG) || !defined(NDEBUG)
sentry_options_set_debug(options, 1);
#else
sentry_options_set_debug(options, 0);
#endif
// release version environment(Testing/production/development/Staging)
sentry_options_set_environment(options, "develop");
sentry_options_set_auto_session_tracking(options, false);
sentry_options_set_symbolize_stacktraces(options, true);
sentry_options_set_on_crash(options, on_crash_callback, NULL);
// Enable before_send hook for filtering sensitive data
sentry_options_set_before_send(options, NULL, NULL);
// Ensure all events and crashes are captured (sample rate 100%)
sentry_options_set_sample_rate(options, 1.0); // Capture 100% of events
sentry_options_set_traces_sample_rate(options, 1.0); // Capture 100% of traces
sentry_init(options);
sentry_start_session();
DWORD processID = GetCurrentProcessId();
sentry_set_tag("PID", std::to_string(processID).c_str());
auto pcName = boost::asio::ip::host_name();
// auto macAddress = getMacAddress();
sentry_set_tag("computer_name", pcName.c_str());
// sentry_set_tag("mac_address", macAddress.c_str());
}
}
extern "C" { extern "C" {
#ifdef SLIC3R_WRAPPER_NOCONSOLE #ifdef SLIC3R_WRAPPER_NOCONSOLE
int APIENTRY wWinMain(HINSTANCE /* hInstance */, HINSTANCE /* hPrevInstance */, PWSTR /* lpCmdLine */, int /* nCmdShow */) int APIENTRY wWinMain(HINSTANCE /* hInstance */, HINSTANCE /* hPrevInstance */, PWSTR /* lpCmdLine */, int /* nCmdShow */)
@@ -222,6 +318,13 @@ int wmain(int argc, wchar_t **argv)
// the application will be killed even if "Ignore" button is pressed. // the application will be killed even if "Ignore" button is pressed.
_set_error_mode(_OUT_TO_MSGBOX); _set_error_mode(_OUT_TO_MSGBOX);
#if defined(_DEBUG) || !defined(NDEBUG)
SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER) ExceptionCrashHandler);
#else
// Initialize Sentry for crash reporting in Release builds
initSentry();
#endif
std::vector<wchar_t*> argv_extended; std::vector<wchar_t*> argv_extended;
argv_extended.emplace_back(argv[0]); argv_extended.emplace_back(argv[0]);
@@ -280,7 +383,6 @@ int wmain(int argc, wchar_t **argv)
} }
#endif /* SLIC3R_GUI */ #endif /* SLIC3R_GUI */
wchar_t path_to_slic3r[MAX_PATH + 1] = {0}; wchar_t path_to_slic3r[MAX_PATH + 1] = {0};
wcscpy(path_to_slic3r, path_to_exe); wcscpy(path_to_slic3r, path_to_exe);
wcscat(path_to_slic3r, L"Snapmaker_Orca.dll"); wcscat(path_to_slic3r, L"Snapmaker_Orca.dll");
@@ -288,11 +390,13 @@ int wmain(int argc, wchar_t **argv)
HINSTANCE hInstance_Slic3r = LoadLibraryExW(path_to_slic3r, nullptr, 0); HINSTANCE hInstance_Slic3r = LoadLibraryExW(path_to_slic3r, nullptr, 0);
if (hInstance_Slic3r == nullptr) { if (hInstance_Slic3r == nullptr) {
printf("Snapmaker_Orca.dll was not loaded, error=%d\n", GetLastError()); printf("Snapmaker_Orca.dll was not loaded, error=%d\n", GetLastError());
sentry_close();
return -1; return -1;
} }
// resolve function address here // resolve function address here
Snapmaker_Orca_main = (Slic3rMainFunc)GetProcAddress(hInstance_Slic3r, Snapmaker_Orca_main = (Slic3rMainFunc)
GetProcAddress(hInstance_Slic3r,
#ifdef _WIN64 #ifdef _WIN64
// there is just a single calling conversion, therefore no mangling of the function name. // there is just a single calling conversion, therefore no mangling of the function name.
"Snapmaker_Orca_main" "Snapmaker_Orca_main"
@@ -302,9 +406,13 @@ int wmain(int argc, wchar_t **argv)
); );
if (Snapmaker_Orca_main == nullptr) { if (Snapmaker_Orca_main == nullptr) {
printf("could not locate the function Snapmaker_Orca_main in Snapmaker_Orca.dll\n"); printf("could not locate the function Snapmaker_Orca_main in Snapmaker_Orca.dll\n");
sentry_close();
return -1; return -1;
} }
// argc minus the trailing nullptr of the argv // argc minus the trailing nullptr of the argv
return Snapmaker_Orca_main((int)argv_extended.size() - 1, argv_extended.data()); auto res = Snapmaker_Orca_main((int) argv_extended.size() - 1, argv_extended.data());
sentry_close();
return res;
} }
} }
-2
View File
@@ -26,6 +26,4 @@ protected:
boost::nowide::ofstream *output_file; boost::nowide::ofstream *output_file;
}; };
#define SET_DEFULTER_HANDLER() SetUnhandledExceptionFilter(CBaseException::UnhandledExceptionFilter)
#define SET_DEFAUL_EXCEPTION() _set_se_translator(CBaseException::STF) #define SET_DEFAUL_EXCEPTION() _set_se_translator(CBaseException::STF)
+1 -1
View File
@@ -1837,7 +1837,7 @@ void PresetBundle::export_selections(AppConfig &config)
void PresetBundle::update_num_filaments(unsigned int to_del_filament_id) void PresetBundle::update_num_filaments(unsigned int to_del_filament_id)
{ {
unsigned old_filament_count = this->filament_presets.size(); unsigned old_filament_count = this->filament_presets.size();
assert(to_del_flament_id < old_filament_count); assert(to_del_filament_id < old_filament_count);
filament_presets.erase(filament_presets.begin() + to_del_filament_id); filament_presets.erase(filament_presets.begin() + to_del_filament_id);
ConfigOptionStrings* filament_color = project_config.option<ConfigOptionStrings>("filament_colour"); ConfigOptionStrings* filament_color = project_config.option<ConfigOptionStrings>("filament_colour");
+5
View File
@@ -1021,6 +1021,11 @@ PreferencesDialog::PreferencesDialog(wxWindow *parent, wxWindowID id, const wxSt
: DPIDialog(parent, id, _L("Preferences"), pos, size, style) : DPIDialog(parent, id, _L("Preferences"), pos, size, style)
{ {
SetBackgroundColour(*wxWHITE); SetBackgroundColour(*wxWHITE);
wxPanel* pPanel = new wxPanel(nullptr);
delete pPanel;
delete pPanel;
create(); create();
wxGetApp().UpdateDlgDarkUI(this); wxGetApp().UpdateDlgDarkUI(this);
Bind(wxEVT_CLOSE_WINDOW, [this](wxCloseEvent& event) { Bind(wxEVT_CLOSE_WINDOW, [this](wxCloseEvent& event) {