diff --git a/Utilities/Thread.cpp b/Utilities/Thread.cpp index 121c0bdc4e..f04d99bd12 100644 --- a/Utilities/Thread.cpp +++ b/Utilities/Thread.cpp @@ -40,6 +40,37 @@ #include #endif +#if defined(__APPLE__) || defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) +# include +# include +# if defined(__DragonFly__) || defined(__FreeBSD__) +# include +# endif +# if defined(__OpenBSD__) +# include +# include +# endif + +# if defined(__NetBSD__) +# undef KERN_PROC +# define KERN_PROC KERN_PROC2 +# define kinfo_proc kinfo_proc2 +# endif + +# if defined(__APPLE__) +# define KP_FLAGS kp_proc.p_flag +# elif defined(__DragonFly__) +# define KP_FLAGS kp_flags +# elif defined(__FreeBSD__) +# define KP_FLAGS ki_flag +# elif defined(__NetBSD__) +# define KP_FLAGS p_flag +# elif defined(__OpenBSD__) +# define KP_FLAGS p_psflags +# define P_TRACED PS_TRACED +# endif +#endif + #include "sync.h" #include "util/logs.hpp" @@ -63,6 +94,28 @@ void fmt_class_string::format(std::string& out, u64 arg) #ifndef _WIN32 bool IsDebuggerPresent() { +#if defined(__APPLE__) || defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) + int mib[] = { + CTL_KERN, + KERN_PROC, + KERN_PROC_PID, + getpid(), +# if defined(__NetBSD__) || defined(__OpenBSD__) + sizeof(struct kinfo_proc), + 1, +# endif + }; + u_int miblen = std::size(mib); + struct kinfo_proc info; + size_t size = sizeof(info); + + if (sysctl(mib, miblen, &info, &size, NULL, 0)) + { + return false; + } + + return info.KP_FLAGS & P_TRACED; +#else char buf[4096]; fs::file status_fd("/proc/self/status"); if (!status_fd) @@ -97,6 +150,7 @@ bool IsDebuggerPresent() } return false; +#endif } #endif