Make Breakpad's debug-exception-ignoring configurable. r=Nicolas Sylvain

git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@224 4c0a9323-5329-0410-9bdc-e9ce6186880e
This commit is contained in:
mmentovai 2007-10-18 20:54:20 +00:00
parent e47d3a6e36
commit f4021f0c68
2 changed files with 18 additions and 3 deletions

View file

@ -72,7 +72,8 @@ ExceptionHandler::ExceptionHandler(const wstring &dump_path,
requesting_thread_id_(0), requesting_thread_id_(0),
exception_info_(NULL), exception_info_(NULL),
assertion_(NULL), assertion_(NULL),
handler_return_value_(false) { handler_return_value_(false),
handle_debug_exceptions_(false) {
#if _MSC_VER >= 1400 // MSVC 2005/8 #if _MSC_VER >= 1400 // MSVC 2005/8
previous_iph_ = NULL; previous_iph_ = NULL;
#endif // _MSC_VER >= 1400 #endif // _MSC_VER >= 1400
@ -274,10 +275,13 @@ LONG ExceptionHandler::HandleException(EXCEPTION_POINTERS *exinfo) {
// Ignore EXCEPTION_BREAKPOINT and EXCEPTION_SINGLE_STEP exceptions. This // Ignore EXCEPTION_BREAKPOINT and EXCEPTION_SINGLE_STEP exceptions. This
// logic will short-circuit before calling WriteMinidumpOnHandlerThread, // logic will short-circuit before calling WriteMinidumpOnHandlerThread,
// allowing something else to handle the breakpoint without incurring the // allowing something else to handle the breakpoint without incurring the
// overhead transitioning to and from the handler thread. // overhead transitioning to and from the handler thread. This behavior
// can be overridden by calling ExceptionHandler::set_handle_debug_exceptions.
DWORD code = exinfo->ExceptionRecord->ExceptionCode; DWORD code = exinfo->ExceptionRecord->ExceptionCode;
LONG action; LONG action;
if (code != EXCEPTION_BREAKPOINT && code != EXCEPTION_SINGLE_STEP && bool is_debug_exception = (code == EXCEPTION_BREAKPOINT) ||
(code == EXCEPTION_SINGLE_STEP);
if ((!is_debug_exception || current_handler->get_handle_debug_exceptions()) &&
current_handler->WriteMinidumpOnHandlerThread(exinfo, NULL)) { current_handler->WriteMinidumpOnHandlerThread(exinfo, NULL)) {
// The handler fully handled the exception. Returning // The handler fully handled the exception. Returning
// EXCEPTION_EXECUTE_HANDLER indicates this to the system, and usually // EXCEPTION_EXECUTE_HANDLER indicates this to the system, and usually

View file

@ -175,6 +175,12 @@ class ExceptionHandler {
// dumps. // dumps.
DWORD get_requesting_thread_id() const { return requesting_thread_id_; } DWORD get_requesting_thread_id() const { return requesting_thread_id_; }
// Controls behavior of EXCEPTION_BREAKPOINT and EXCEPTION_SINGLE_STEP.
bool get_handle_debug_exceptions() const { return handle_debug_exceptions_; }
void set_handle_debug_exceptions(bool handle_debug_exceptions) {
handle_debug_exceptions_ = handle_debug_exceptions;
}
private: private:
friend class AutoExceptionHandler; friend class AutoExceptionHandler;
@ -322,6 +328,11 @@ class ExceptionHandler {
// the requesting thread. // the requesting thread.
bool handler_return_value_; bool handler_return_value_;
// If true, the handler will intercept EXCEPTION_BREAKPOINT and
// EXCEPTION_SINGLE_STEP exceptions. Leave this false (the default)
// to not interfere with debuggers.
bool handle_debug_exceptions_;
// A stack of ExceptionHandler objects that have installed unhandled // A stack of ExceptionHandler objects that have installed unhandled
// exception filters. This vector is used by HandleException to determine // exception filters. This vector is used by HandleException to determine
// which ExceptionHandler object to route an exception to. When an // which ExceptionHandler object to route an exception to. When an