|  | // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 
|  | // 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 "base/logging.h" | 
|  | #include "base/threading/platform_thread.h" | 
|  |  | 
|  | namespace base { | 
|  | namespace debug { | 
|  |  | 
|  | static bool is_debug_ui_suppressed = false; | 
|  |  | 
|  | bool WaitForDebugger(int wait_seconds, bool silent) { | 
|  | #if defined(OS_ANDROID) | 
|  | // The pid from which we know which process to attach to are not output by | 
|  | // android ddms, so we have to print it out explicitly. | 
|  | DLOG(INFO) << "DebugUtil::WaitForDebugger(pid=" << static_cast<int>(getpid()) | 
|  | << ")"; | 
|  | #endif | 
|  | for (int i = 0; i < wait_seconds * 10; ++i) { | 
|  | if (BeingDebugged()) { | 
|  | if (!silent) { | 
|  | #if defined(__LB_ANDROID__) | 
|  | // Hack around a race condition where the debugger is still attaching | 
|  | // and isn't ready to catch the trap thrown by BreakDebugger yet. | 
|  | PlatformThread::Sleep(TimeDelta::FromSeconds(5)); | 
|  | #endif | 
|  | BreakDebugger(); | 
|  | } | 
|  | return true; | 
|  | } | 
|  | PlatformThread::Sleep(TimeDelta::FromMilliseconds(100)); | 
|  | } | 
|  | return false; | 
|  | } | 
|  |  | 
|  | void SetSuppressDebugUI(bool suppress) { | 
|  | is_debug_ui_suppressed = suppress; | 
|  | } | 
|  |  | 
|  | bool IsDebugUISuppressed() { | 
|  | return is_debug_ui_suppressed; | 
|  | } | 
|  |  | 
|  | }  // namespace debug | 
|  | }  // namespace base |