blob: e8994805e3a0a6beb376e3976e0f8dbacea1600f [file] [log] [blame]
// Copyright 2016 The Android Open Source Project
//
// This software is licensed under the terms of the GNU General Public
// License version 2, as published by the Free Software Foundation, and
// may be copied, distributed, and modified under those terms.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
#pragma once
#include "android/base/system/System.h"
// A macro to define piece of code only for debugging. This is useful when
// checks are much bigger than a single assert(), e.g.:
// class Lock {
// ANDROID_IF_DEBUG(bool isLocked() { ... })
// ...
// };
//
// void foo::bar() { assert(mLock.isLocked()); }
//
// Lock::isLocked() won't exist in release binaries at all.
//
#ifdef NDEBUG
#define ANDROID_IF_DEBUG(x)
#else // !NDEBUG
#define ANDROID_IF_DEBUG(x) x
#endif // !NDEBUG
namespace android {
namespace base {
// Checks if the current process has a debugger attached.
bool IsDebuggerAttached();
// Suspends the current process for up to |timeoutMs| until a debugger attaches.
// |timeoutMs| == -1 means 'no timeout'
bool WaitForDebugger(System::Duration timeoutMs = -1);
// Issues a break into debugger (if one attached). Without a debugger it could
// do anything, but most probably will crash.
void DebugBreak();
} // namespace base
} // namespace android