Bug 1066760 - Use more detailed abort message on Android; r=snorp

This commit is contained in:
Jim Chen committed 2014-09-24 14:12:54 -04:00
1 parent 7759a0439a
commit 1861274858
1 file changed
+31 -1
+31 -1
View File
@@ -16,6 +16,7 @@
#endif
#ifdef MOZ_WIDGET_ANDROID
# include "APKOpen.h"
# include "dlfcn.h"
#endif
#include <stdio.h>
@@ -36,13 +37,42 @@ mozalloc_abort(const char* const msg)
MOZ_CRASH();
}
#ifdef MOZ_WIDGET_ANDROID
template <size_t N>
void fillAbortMessage(char (&msg)[N], uintptr_t retAddress) {
/*
* On Android, we often don't have reliable backtrace when crashing inside
* abort(). Therefore, we try to find out who is calling abort() and add
* that to the message.
*/
Dl_info info = {};
dladdr(reinterpret_cast<void*>(retAddress), &info);
const char* const module = info.dli_fname ? info.dli_fname : "";
const char* const base_module = strrchr(module, '/');
const void* const module_offset =
reinterpret_cast<void*>(retAddress - uintptr_t(info.dli_fbase));
const char* const sym = info.dli_sname ? info.dli_sname : "";
snprintf(msg, sizeof(msg), "abort() called from %s:%p (%s)",
base_module ? base_module + 1 : module, module_offset, sym);
}
#endif
#if defined(XP_UNIX)
// Define abort() here, so that it is used instead of the system abort(). This
// lets us control the behavior when aborting, in order to get better results
// on *NIX platforms. See mozalloc_abort for details.
void abort(void)
{
mozalloc_abort("Redirecting call to abort() to mozalloc_abort\n");
#ifdef MOZ_WIDGET_ANDROID
char msg[64] = {};
fillAbortMessage(msg, uintptr_t(__builtin_return_address(0)));
#else
const char* const msg = "Redirecting call to abort() to mozalloc_abort\n";
#endif
mozalloc_abort(msg);
}
#endif