mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
68 lines
1.9 KiB
C++
68 lines
1.9 KiB
C++
// Copyright 2013 The Flutter Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#include "flutter/testing/debugger_detection.h"
|
|
|
|
#include "flutter/fml/build_config.h"
|
|
#include "flutter/fml/logging.h"
|
|
|
|
#if FML_OS_MACOSX
|
|
#include <assert.h>
|
|
#include <stdbool.h>
|
|
#include <sys/sysctl.h>
|
|
#include <sys/types.h>
|
|
#include <unistd.h>
|
|
#endif // FML_OS_MACOSX
|
|
|
|
#if FML_OS_WIN
|
|
#include <windows.h>
|
|
#endif // FML_OS_WIN
|
|
|
|
namespace flutter {
|
|
namespace testing {
|
|
|
|
DebuggerStatus GetDebuggerStatus() {
|
|
#if FML_OS_MACOSX
|
|
// From Technical Q&A QA1361 Detecting the Debugger
|
|
// https://developer.apple.com/library/archive/qa/qa1361/_index.html
|
|
int management_info_base[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 management_info_base, which tells sysctl the info we want, in
|
|
// this case we're looking for information about a specific process ID.
|
|
management_info_base[0] = CTL_KERN;
|
|
management_info_base[1] = KERN_PROC;
|
|
management_info_base[2] = KERN_PROC_PID;
|
|
management_info_base[3] = getpid();
|
|
|
|
// Call sysctl.
|
|
|
|
size = sizeof(info);
|
|
auto status =
|
|
::sysctl(management_info_base,
|
|
sizeof(management_info_base) / sizeof(*management_info_base),
|
|
&info, &size, NULL, 0);
|
|
FML_CHECK(status == 0);
|
|
|
|
// We're being debugged if the P_TRACED flag is set.
|
|
return ((info.kp_proc.p_flag & P_TRACED) != 0) ? DebuggerStatus::kAttached
|
|
: DebuggerStatus::kDontKnow;
|
|
|
|
#elif FML_OS_WIN
|
|
return ::IsDebuggerPresent() ? DebuggerStatus::kAttached
|
|
: DebuggerStatus::kDontKnow;
|
|
|
|
#else
|
|
return DebuggerStatus::kDontKnow;
|
|
#endif
|
|
} // namespace testing
|
|
|
|
} // namespace testing
|
|
} // namespace flutter
|