Index: base/debug_util_posix.cc |
=================================================================== |
--- base/debug_util_posix.cc (revision 2969) |
+++ base/debug_util_posix.cc (working copy) |
@@ -4,32 +4,58 @@ |
#include "base/debug_util.h" |
-#include <unistd.h> |
+#include <fcntl.h> |
+#include <sys/stat.h> |
#include <sys/sysctl.h> |
#include <sys/types.h> |
-#include <sys/stat.h> |
-#include <fcntl.h> |
+#include <unistd.h> |
+#include "base/basictypes.h" |
#include "base/logging.h" |
#include "base/string_piece.h" |
+// static |
bool DebugUtil::SpawnDebuggerOnProcess(unsigned /* process_id */) { |
NOTIMPLEMENTED(); |
return false; |
} |
#if defined(OS_MACOSX) |
+ |
+// Based on Apple's recommended method as described in |
// http://developer.apple.com/qa/qa2004/qa1361.html |
+// static |
bool DebugUtil::BeingDebugged() { |
- NOTIMPLEMENTED(); |
- return false; |
+ // Initialize mib, which tells sysctl what info we want. In this case, |
+ // we're looking for information about a specific process ID. |
+ int mib[] = { |
+ CTL_KERN, |
+ KERN_PROC, |
+ KERN_PROC_PID, |
+ getpid() |
+ }; |
+ |
+ // Caution: struct kinfo_proc is marked __APPLE_API_UNSTABLE. The source and |
+ // binary interfaces may change. |
+ struct kinfo_proc info; |
+ size_t info_size = sizeof(info); |
+ |
+ int sysctl_result = sysctl(mib, arraysize(mib), &info, &info_size, NULL, 0); |
+ DCHECK(sysctl_result == 0); |
+ if (sysctl_result != 0) |
+ return false; |
+ |
+ // This process is being debugged if the P_TRACED flag is set. |
+ return (info.kp_proc.p_flag & P_TRACED) != 0; |
} |
#elif defined(OS_LINUX) |
+ |
// 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. |
+// static |
bool DebugUtil::BeingDebugged() { |
int status_fd = open("/proc/self/status", O_RDONLY); |
if (status_fd == -1) |
@@ -57,10 +83,10 @@ |
pid_index += tracer.size(); |
return pid_index < status.size() && status[pid_index] != '0'; |
} |
-#endif |
+#endif // OS_LINUX |
+ |
// static |
void DebugUtil::BreakDebugger() { |
asm ("int3"); |
} |
- |