aboutsummaryrefslogtreecommitdiff
path: root/src/client/linux/handler
diff options
context:
space:
mode:
authorluly81 <luly81@4c0a9323-5329-0410-9bdc-e9ce6186880e>2007-03-29 01:32:39 +0000
committerluly81 <luly81@4c0a9323-5329-0410-9bdc-e9ce6186880e>2007-03-29 01:32:39 +0000
commit3479e850c550ae1e182c7b62efa3fd09d3f6cbd1 (patch)
treec97600eec4956ff371bc87cd85e0a99512806c93 /src/client/linux/handler
parentFix bug of issue 135, now can dump symbols for dynamic libraries. (diff)
downloadbreakpad-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
Diffstat (limited to 'src/client/linux/handler')
-rw-r--r--src/client/linux/handler/exception_handler.cc22
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);