From 1441da246b9d2c31052cc83c887b9d7e609b897b Mon Sep 17 00:00:00 2001 From: Noisyfox Date: Mon, 2 Jun 2025 16:17:11 +0800 Subject: [PATCH] Add debugger detector for macOS --- src/slic3r/GUI/GUI_App.cpp | 4 +++- src/slic3r/GUI/GUI_Utils.hpp | 2 ++ src/slic3r/GUI/GUI_UtilsMac.mm | 37 +++++++++++++++++++++++++++++++++- 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index f537d1f1b7..2bd663c7cb 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -2582,8 +2582,10 @@ bool GUI_App::on_init_inner() // See https://github.com/bambulab/BambuStudio/issues/6726 if (!NetworkAgent::use_legacy_network) { bool debugger_attached = false; -#ifdef __WINDOWS__ +#if defined(__WINDOWS__) debugger_attached = IsDebuggerPresent(); +#elif defined(__WXOSX__) + debugger_attached = is_debugger_present(); #endif if (debugger_attached) { NetworkAgent::use_legacy_network = true; diff --git a/src/slic3r/GUI/GUI_Utils.hpp b/src/slic3r/GUI/GUI_Utils.hpp index cbfd4e3155..c9750e25b9 100644 --- a/src/slic3r/GUI/GUI_Utils.hpp +++ b/src/slic3r/GUI/GUI_Utils.hpp @@ -496,6 +496,8 @@ int get_dpi_for_window(const wxWindow *window); #ifdef __WXOSX__ void dataview_remove_insets(wxDataViewCtrl* dv); + +bool is_debugger_present(); #endif /// diff --git a/src/slic3r/GUI/GUI_UtilsMac.mm b/src/slic3r/GUI/GUI_UtilsMac.mm index 46ee9dce7e..6e9605fbb6 100644 --- a/src/slic3r/GUI/GUI_UtilsMac.mm +++ b/src/slic3r/GUI/GUI_UtilsMac.mm @@ -1,4 +1,5 @@ - +#include +#include #import #import "GUI_Utils.hpp" @@ -14,6 +15,40 @@ void dataview_remove_insets(wxDataViewCtrl* dv) { } } +bool is_debugger_present() +// Returns true if the current process is being debugged (either +// running under the debugger or has a debugger attached post facto). +// https://stackoverflow.com/a/2200786/3289421 +{ + int junk; + int mib[4]; + struct kinfo_proc info; + size_t size; + + // Initialize the flags so that, if sysctl fails for some bizarre + // reason, we get a predictable result. + + info.kp_proc.p_flag = 0; + + // Initialize mib, which tells sysctl the info we want, in this case + // we're looking for information about a specific process ID. + + mib[0] = CTL_KERN; + mib[1] = KERN_PROC; + mib[2] = KERN_PROC_PID; + mib[3] = getpid(); + + // Call sysctl. + + size = sizeof(info); + junk = sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0); + assert(junk == 0); + + // We're being debugged if the P_TRACED flag is set. + + return ( (info.kp_proc.p_flag & P_TRACED) != 0 ); +} + } }