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:
parent
e47d3a6e36
commit
f4021f0c68
2 changed files with 18 additions and 3 deletions
|
@ -72,7 +72,8 @@ ExceptionHandler::ExceptionHandler(const wstring &dump_path,
|
|||
requesting_thread_id_(0),
|
||||
exception_info_(NULL),
|
||||
assertion_(NULL),
|
||||
handler_return_value_(false) {
|
||||
handler_return_value_(false),
|
||||
handle_debug_exceptions_(false) {
|
||||
#if _MSC_VER >= 1400 // MSVC 2005/8
|
||||
previous_iph_ = NULL;
|
||||
#endif // _MSC_VER >= 1400
|
||||
|
@ -274,10 +275,13 @@ LONG ExceptionHandler::HandleException(EXCEPTION_POINTERS *exinfo) {
|
|||
// Ignore EXCEPTION_BREAKPOINT and EXCEPTION_SINGLE_STEP exceptions. This
|
||||
// logic will short-circuit before calling WriteMinidumpOnHandlerThread,
|
||||
// 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;
|
||||
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)) {
|
||||
// The handler fully handled the exception. Returning
|
||||
// EXCEPTION_EXECUTE_HANDLER indicates this to the system, and usually
|
||||
|
|
|
@ -175,6 +175,12 @@ class ExceptionHandler {
|
|||
// dumps.
|
||||
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:
|
||||
friend class AutoExceptionHandler;
|
||||
|
||||
|
@ -322,6 +328,11 @@ class ExceptionHandler {
|
|||
// the requesting thread.
|
||||
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
|
||||
// exception filters. This vector is used by HandleException to determine
|
||||
// which ExceptionHandler object to route an exception to. When an
|
||||
|
|
Loading…
Reference in a new issue