aboutsummaryrefslogtreecommitdiff
path: root/src/client/linux/handler/exception_handler.cc
diff options
context:
space:
mode:
authorted.mielczarek <ted.mielczarek@4c0a9323-5329-0410-9bdc-e9ce6186880e>2008-10-14 11:21:34 +0000
committerted.mielczarek <ted.mielczarek@4c0a9323-5329-0410-9bdc-e9ce6186880e>2008-10-14 11:21:34 +0000
commitc5f46b2f4b43e331650b32cb9d286246cd4fdac1 (patch)
tree780337e0df2479e2dace76b7fa7be29b96523f09 /src/client/linux/handler/exception_handler.cc
parentFix for DWARF processing when inline functions were encountered. Inline func... (diff)
downloadbreakpad-c5f46b2f4b43e331650b32cb9d286246cd4fdac1.tar.xz
Issue 276 - generate GUIDs ahead of time in Linux handler. r=Liu Li
git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@290 4c0a9323-5329-0410-9bdc-e9ce6186880e
Diffstat (limited to 'src/client/linux/handler/exception_handler.cc')
-rw-r--r--src/client/linux/handler/exception_handler.cc64
1 files changed, 37 insertions, 27 deletions
diff --git a/src/client/linux/handler/exception_handler.cc b/src/client/linux/handler/exception_handler.cc
index b87acf4d..b253cb39 100644
--- a/src/client/linux/handler/exception_handler.cc
+++ b/src/client/linux/handler/exception_handler.cc
@@ -118,7 +118,9 @@ ExceptionHandler::~ExceptionHandler() {
}
bool ExceptionHandler::WriteMinidump() {
- return InternalWriteMinidump(0, 0, NULL);
+ bool success = InternalWriteMinidump(0, 0, NULL);
+ UpdateNextID();
+ return success;
}
// static
@@ -226,41 +228,49 @@ bool ExceptionHandler::InternalWriteMinidump(int signo,
if (filter_ && !filter_(callback_context_))
return false;
+ bool success = false;
+ // 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(
+ next_minidump_path_c_, signo, sighandler_ebp, sig_ctx);
+
+ // Unblock the signals.
+ if (blocked) {
+ sigprocmask(SIG_SETMASK, &sig_old, &sig_old);
+ }
+
+ if (callback_)
+ success = callback_(dump_path_c_, next_minidump_id_c_,
+ callback_context_, success);
+ return success;
+}
+
+void ExceptionHandler::UpdateNextID() {
GUID guid;
- bool success = false;;
char guid_str[kGUIDStringLength + 1];
if (CreateGUID(&guid) && GUIDToString(&guid, guid_str, sizeof(guid_str))) {
+ next_minidump_id_ = guid_str;
+ next_minidump_id_c_ = next_minidump_id_.c_str();
+
char minidump_path[PATH_MAX];
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, sighandler_ebp, 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);
+ next_minidump_path_ = minidump_path;
+ next_minidump_path_c_ = next_minidump_path_.c_str();
}
- return success;
}
} // namespace google_breakpad