diff options
author | luly81 <luly81@4c0a9323-5329-0410-9bdc-e9ce6186880e> | 2007-03-29 01:32:39 +0000 |
---|---|---|
committer | luly81 <luly81@4c0a9323-5329-0410-9bdc-e9ce6186880e> | 2007-03-29 01:32:39 +0000 |
commit | 3479e850c550ae1e182c7b62efa3fd09d3f6cbd1 (patch) | |
tree | c97600eec4956ff371bc87cd85e0a99512806c93 | |
parent | Fix bug of issue 135, now can dump symbols for dynamic libraries. (diff) | |
download | breakpad-3479e850c550ae1e182c7b62efa3fd09d3f6cbd1.tar.xz |
Fix issue 136.
Block signals before writing minidumps.
git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@134 4c0a9323-5329-0410-9bdc-e9ce6186880e
-rw-r--r-- | src/client/linux/handler/exception_handler.cc | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/src/client/linux/handler/exception_handler.cc b/src/client/linux/handler/exception_handler.cc index 59b50df7..eb7cbce2 100644 --- a/src/client/linux/handler/exception_handler.cc +++ b/src/client/linux/handler/exception_handler.cc @@ -214,7 +214,7 @@ void ExceptionHandler::HandleException(int signo) { bool ExceptionHandler::InternalWriteMinidump(int signo, const struct sigcontext *sig_ctx) { if (filter_ && !filter_(callback_context_)) - return false; + return false; GUID guid; bool success = false;; @@ -224,8 +224,28 @@ bool ExceptionHandler::InternalWriteMinidump(int signo, snprintf(minidump_path, sizeof(minidump_path), "%s/%s.dmp", dump_path_c_, guid_str); + + // Block all the signals we want to process when writting minidump. + // We don't want it to be interrupted. + sigset_t sig_blocked, sig_old; + bool blocked = true; + sigfillset(&sig_blocked); + for (size_t i = 0; i < sizeof(SigTable) / sizeof(SigTable[0]); ++i) + sigdelset(&sig_blocked, SigTable[i]); + if (sigprocmask(SIG_BLOCK, &sig_blocked, &sig_old) != 0) { + blocked = false; + fprintf(stderr, "google_breakpad::ExceptionHandler::HandleException: " + "failed to block signals.\n"); + } + success = minidump_generator_.WriteMinidumpToFile( minidump_path, signo, sig_ctx); + + // Unblock the signals. + if (blocked) { + sigprocmask(SIG_SETMASK, &sig_old, &sig_old); + } + if (callback_) success = callback_(dump_path_c_, guid_str, callback_context_, success); |