| // 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 |