xref: /aosp_15_r20/external/cronet/base/debug/debugger_fuchsia.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2021 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "base/debug/debugger.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <lib/zx/process.h>
8*6777b538SAndroid Build Coastguard Worker #include <stdlib.h>
9*6777b538SAndroid Build Coastguard Worker #include <unistd.h>
10*6777b538SAndroid Build Coastguard Worker #include <zircon/process.h>
11*6777b538SAndroid Build Coastguard Worker #include <zircon/syscalls.h>
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker #include "base/debug/alias.h"
14*6777b538SAndroid Build Coastguard Worker 
15*6777b538SAndroid Build Coastguard Worker namespace base {
16*6777b538SAndroid Build Coastguard Worker namespace debug {
17*6777b538SAndroid Build Coastguard Worker 
BeingDebugged()18*6777b538SAndroid Build Coastguard Worker bool BeingDebugged() {
19*6777b538SAndroid Build Coastguard Worker   zx_info_process_t info = {};
20*6777b538SAndroid Build Coastguard Worker   // Ignore failures. The 0-initialization above will result in "false" for
21*6777b538SAndroid Build Coastguard Worker   // error cases.
22*6777b538SAndroid Build Coastguard Worker   zx::process::self()->get_info(ZX_INFO_PROCESS, &info, sizeof(info),
23*6777b538SAndroid Build Coastguard Worker                                 nullptr, nullptr);
24*6777b538SAndroid Build Coastguard Worker   return (info.flags & ZX_INFO_PROCESS_FLAG_DEBUGGER_ATTACHED) != 0;
25*6777b538SAndroid Build Coastguard Worker }
26*6777b538SAndroid Build Coastguard Worker 
BreakDebuggerAsyncSafe()27*6777b538SAndroid Build Coastguard Worker void BreakDebuggerAsyncSafe() {
28*6777b538SAndroid Build Coastguard Worker   // NOTE: This code MUST be async-signal safe (it's used by in-process
29*6777b538SAndroid Build Coastguard Worker   // stack dumping signal handler). NO malloc or stdio is allowed here.
30*6777b538SAndroid Build Coastguard Worker 
31*6777b538SAndroid Build Coastguard Worker   // Linker's ICF feature may merge this function with other functions with the
32*6777b538SAndroid Build Coastguard Worker   // same definition (e.g. any function whose sole job is to call abort()) and
33*6777b538SAndroid Build Coastguard Worker   // it may confuse the crash report processing system. http://crbug.com/508489
34*6777b538SAndroid Build Coastguard Worker   static int static_variable_to_make_this_function_unique = 0;
35*6777b538SAndroid Build Coastguard Worker   Alias(&static_variable_to_make_this_function_unique);
36*6777b538SAndroid Build Coastguard Worker 
37*6777b538SAndroid Build Coastguard Worker   abort();
38*6777b538SAndroid Build Coastguard Worker }
39*6777b538SAndroid Build Coastguard Worker 
VerifyDebugger()40*6777b538SAndroid Build Coastguard Worker void VerifyDebugger() {}
41*6777b538SAndroid Build Coastguard Worker 
42*6777b538SAndroid Build Coastguard Worker }  // namespace debug
43*6777b538SAndroid Build Coastguard Worker }  // namespace base
44