174#if defined(Q_OS_LINUX)
175 int fd = open(
"/proc/self/status", O_RDONLY);
179 ssize_t size = read(fd, buffer,
sizeof(buffer) - 1);
185 const char tracerPidToken[] =
"\nTracerPid:";
186 char *tracerPid = strstr(buffer, tracerPidToken);
191 tracerPid +=
sizeof(tracerPidToken);
192 long int pid = strtol(tracerPid, &tracerPid, 10);
195#elif defined(Q_OS_WIN)
196 return IsDebuggerPresent();
197#elif defined(Q_OS_MACOS)
199 mach_msg_type_number_t portCount = 0;
200 exception_mask_t masks[EXC_TYPES_COUNT];
201 mach_port_t ports[EXC_TYPES_COUNT];
202 exception_behavior_t behaviors[EXC_TYPES_COUNT];
203 thread_state_flavor_t flavors[EXC_TYPES_COUNT];
204 exception_mask_t mask = EXC_MASK_ALL & ~(EXC_MASK_RESOURCE | EXC_MASK_GUARD);
205 kern_return_t result = task_get_exception_ports(mach_task_self(), mask, masks, &portCount,
206 ports, behaviors, flavors);
207 if (result == KERN_SUCCESS) {
208 for (mach_msg_type_number_t portIndex = 0; portIndex < portCount; ++portIndex) {
209 if (MACH_PORT_VALID(ports[portIndex])) {
253 const int disableStackDump = qEnvironmentVariableIntValue(
"QTEST_DISABLE_STACK_DUMP", &ok);
254 if (ok && disableStackDump)
257 if (hasSystemCrashReporter())
260#if defined(Q_OS_MACOS)
263# if defined(Q_PROCESSOR_ARM)
266 #define CSR_ALLOW_UNRESTRICTED_FS (1
<< 1
)
267 std::optional<uint32_t> sipConfiguration = qt_mac_sipConfiguration();
268 if (!sipConfiguration || !(*sipConfiguration & CSR_ALLOW_UNRESTRICTED_FS))
275 auto hasExecutable = [](
const char *execname) {
276 std::string candidate;
278 if (
const char *p = getenv(
"PATH"); p && *p)
281 path = _PATH_DEFPATH;
282 for (
const char *p = std::strtok(&path[0],
":'"); p; p = std::strtok(
nullptr,
":")) {
285 candidate += execname;
286 if (QT_ACCESS(candidate.data(), X_OK) == 0)
292 static constexpr DebuggerProgram debuggerSearchOrder[] = {
293# if defined(Q_OS_QNX) || (defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID))
299 for (DebuggerProgram candidate : debuggerSearchOrder) {
305 if (hasExecutable(
"gdb")) {
311 if (hasExecutable(
"lldb")) {