| // Copyright 2015 The Cobalt Authors. All Rights Reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #include "starboard/system.h" |
| |
| #include <fcntl.h> |
| #include <string.h> |
| #include <sys/stat.h> |
| #include <unistd.h> |
| |
| #include "starboard/log.h" |
| |
| #include "starboard/shared/posix/file_internal.h" |
| #include "starboard/shared/posix/handle_eintr.h" |
| |
| // Adapted from base/debug/debugger_posix.cc |
| bool SbSystemIsDebuggerAttached() { |
| // We can look in /proc/self/status for TracerPid. We are likely used in |
| // crash handling, so we are careful not to use the heap or have side effects. |
| // Another option that is common is to try to ptrace yourself, but then we |
| // can't detach without forking(), and that's not so great. |
| |
| // 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. |
| |
| int status_fd = open("/proc/self/status", O_RDONLY); |
| if (status_fd == -1) |
| return false; |
| |
| // We assume our line will be in the first 1024 characters and that we can |
| // read this much all at once. In practice this will generally be true. |
| // This simplifies and speeds up things considerably. |
| char buf[1024]; |
| |
| ssize_t num_read = HANDLE_EINTR(read(status_fd, buf, sizeof(buf) - 1)); |
| SB_DCHECK(num_read < sizeof(buf)); |
| if (HANDLE_EINTR(close(status_fd)) < 0) |
| return false; |
| |
| if (num_read <= 0) |
| return false; |
| |
| buf[num_read] = '\0'; |
| const char tracer[] = "TracerPid:\t"; |
| char* pid_index = strstr(buf, tracer); |
| if (pid_index == NULL) |
| return false; |
| |
| // Our pid is 0 without a debugger, assume this for any pid starting with 0. |
| pid_index += strlen(tracer); |
| return pid_index < (buf + num_read) && *pid_index != '0'; |
| } |