// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/debug/debugger.h"
#include <lib/zx/process.h>
#include <stdlib.h>
#include <unistd.h>
#include <zircon/process.h>
#include <zircon/syscalls.h>
#include "base/debug/alias.h"
namespace base {
namespace debug {
bool BeingDebugged() {
zx_info_process_t info = {};
// Ignore failures. The 0-initialization above will result in "false" for
// error cases.
zx::process::self()->get_info(ZX_INFO_PROCESS, &info, sizeof(info),
nullptr, nullptr);
return (info.flags & ZX_INFO_PROCESS_FLAG_DEBUGGER_ATTACHED) != 0;
}
void BreakDebuggerAsyncSafe() {
// NOTE: This code MUST be async-signal safe (it's used by in-process
// stack dumping signal handler). NO malloc or stdio is allowed here.
// Linker's ICF feature may merge this function with other functions with the
// same definition (e.g. any function whose sole job is to call abort()) and
// it may confuse the crash report processing system. http://crbug.com/508489
static int static_variable_to_make_this_function_unique = 0;
Alias(&static_variable_to_make_this_function_unique);
abort();
}
void VerifyDebugger() {}
} // namespace debug
} // namespace base