Index: chrome/app/breakpad_mac.mm |
diff --git a/chrome/app/breakpad_mac.mm b/chrome/app/breakpad_mac.mm |
index f078271683fa448de75f40818ed7a9491d7ab3ac..f73d06add082528210dbb90741aa93e96768ff5f 100644 |
--- a/chrome/app/breakpad_mac.mm |
+++ b/chrome/app/breakpad_mac.mm |
@@ -50,6 +50,36 @@ void ClearCrashKeyValue(NSString* key) { |
BreakpadRemoveUploadParameter(gBreakpadRef, key); |
} |
+bool FatalMessageHandler(int severity, const char* file, int line, |
+ size_t message_start, const std::string& str) { |
+ // Do not handle non-FATAL. |
+ if (severity != logging::LOG_FATAL) |
+ return false; |
+ |
+ // Only log last path component. This matches logging.cc. |
+ // NOTE(shess): Could look for the shared prefix between |file| and |
Mark Mentovai
2011/10/26 23:50:27
If this were to become a fully-cooked idea, it wou
Scott Hess - ex-Googler
2011/10/27 00:15:09
removed.
|
+ // |__FILE__|, and store what's left. |
+ if (file) { |
+ const char* slash = rindex(file, '/'); |
Mark Mentovai
2011/10/26 23:50:27
strrchr is the modern name for rindex. Use that.
Scott Hess - ex-Googler
2011/10/27 00:15:09
GET OFF MY LAWN!
|
+ if (slash) |
+ file = slash + 1; |
Mark Mentovai
2011/10/26 23:50:27
If file is an empty string, this is dangerous. Be
dmac
2011/10/27 00:07:11
if file is an empty string, won't slash be NULL? a
Scott Hess - ex-Googler
2011/10/27 00:15:09
If file were empty, slash would be NULL.
|
+ } |
+ |
+ // What happens if we ran out of memory and the construction does a |
Mark Mentovai
2011/10/26 23:50:27
You know how I feel about “we.”
Scott Hess - ex-Googler
2011/10/27 00:15:09
Bother.
|
+ // malloc? Infinite loop! By putting a CHECK() in this code, I |
+ // verified that it still crashed after running out of stack... |
+ // Solving would maybe need a pre-allocated mutable string? |
Mark Mentovai
2011/10/26 23:50:27
You can have a static bool that gets set when you
Scott Hess - ex-Googler
2011/10/27 00:15:09
I think that's reasonable. I'll put that up as a
|
+ NSString* fatal_key = @"LOG_FATAL"; |
+ NSString* fatal_value = |
+ [NSString stringWithFormat:@"%s:%d: %s", |
+ file, line, str.c_str() + message_start]; |
+ SetCrashKeyValue(fatal_key, fatal_value); |
+ |
+ // Rather than including the code to force the crash here, allow the |
+ // caller to do it. |
+ return false; |
+} |
+ |
} // namespace |
bool IsCrashReporterEnabled() { |
@@ -176,7 +206,9 @@ void InitCrashReporter() { |
std::string guid = |
command_line->GetSwitchValueASCII(switches::kEnableCrashReporter); |
child_process_logging::SetClientId(guid); |
- } |
+ } |
+ |
+ logging::SetLogMessageHandler(&FatalMessageHandler); |
} |
void InitCrashProcessInfo() { |