From 7c96c0ef20ec07e927ef5fc938417c7540714093 Mon Sep 17 00:00:00 2001 From: Ted Mielczarek Date: Tue, 19 Oct 2010 15:05:47 -0400 Subject: [PATCH] bug 603592 - Add an API for the Android embedding to use to provide info about shared libraries mapped into anonymous mappings. r=mwu a=blocking-fennec --- .../linux/minidump_writer/minidump_writer.cc | 10 ++- toolkit/crashreporter/nsExceptionHandler.cpp | 65 +++++++++++++++++++ toolkit/crashreporter/nsExceptionHandler.h | 13 ++++ 3 files changed, 85 insertions(+), 3 deletions(-) diff --git a/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/minidump_writer.cc b/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/minidump_writer.cc index a0438fa4356e..f4ad4c00f3b6 100644 --- a/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/minidump_writer.cc +++ b/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/minidump_writer.cc @@ -437,7 +437,8 @@ class MinidumpWriter { // case (2) above MinidumpWriter(const char* filename, pid_t pid, - pid_t blame_thread) + pid_t blame_thread, + const MappingList& mappings) : filename_(filename), siginfo_(NULL), // we fill this in if we find blame_thread ucontext_(NULL), @@ -445,7 +446,8 @@ class MinidumpWriter { crashing_tid_(blame_thread), crashing_tid_pc_(0), // set if we find blame_thread dumper_(pid), - memory_blocks_(dumper_.allocator()) { + memory_blocks_(dumper_.allocator()), + mapping_info_(mappings) { } bool Init() { @@ -1379,7 +1381,9 @@ bool WriteMinidump(const char* filename, pid_t crashing_process, bool WriteMinidump(const char* filename, pid_t process, pid_t process_blamed_thread) { - MinidumpWriter writer(filename, process, process_blamed_thread); + //TODO: support mappings here + MappingList m; + MinidumpWriter writer(filename, process, process_blamed_thread, m); if (!writer.Init()) return false; return writer.Dump(); diff --git a/toolkit/crashreporter/nsExceptionHandler.cpp b/toolkit/crashreporter/nsExceptionHandler.cpp index 17007b52711d..17b4605146ed 100644 --- a/toolkit/crashreporter/nsExceptionHandler.cpp +++ b/toolkit/crashreporter/nsExceptionHandler.cpp @@ -103,6 +103,7 @@ #include "nsInterfaceHashtable.h" #include "prprf.h" #include "nsIXULAppInfo.h" +#include #if defined(XP_MACOSX) CFStringRef reporterClientAppID = CFSTR("org.mozilla.crashreporter"); @@ -242,6 +243,30 @@ static cpu_type_t pref_cpu_types[2] = { static posix_spawnattr_t spawnattr; #endif +#if defined(__ANDROID__) +// Android builds use a custom library loader, +// so the embedding will provide a list of shared +// libraries that are mapped into anonymous mappings. +typedef struct { + std::string name; + std::string debug_id; + uintptr_t start_address; + size_t length; + size_t file_offset; +} mapping_info; +static std::vector library_mappings; + +void FileIDToGUID(const char* file_id, u_int8_t guid[sizeof(MDGUID)]) +{ + for (int i = 0; i < sizeof(MDGUID); i++) { + int c; + sscanf(file_id, "%02X", &c); + guid[i] = (u_int8_t)(c & 0xFF); + file_id += 2; + } +} +#endif + #ifdef XP_LINUX inline void my_timetostring(time_t t, char* buffer, size_t buffer_length) @@ -683,6 +708,18 @@ nsresult SetExceptionHandler(nsILocalFile* aXREDirectory, showOSCrashReporter = prefValue; #endif +#if defined(__ANDROID__) + for (unsigned int i = 0; i < library_mappings.size(); i++) { + u_int8_t guid[sizeof(MDGUID)]; + FileIDToGUID(library_mappings[i].debug_id.c_str(), guid); + gExceptionHandler->AddMappingInfo(library_mappings[i].name, + guid, + library_mappings[i].start_address, + library_mappings[i].length, + library_mappings[i].file_offset); + } +#endif + return NS_OK; } @@ -1961,4 +1998,32 @@ UnsetRemoteExceptionHandler() #endif // MOZ_IPC +#if defined(__ANDROID__) +void AddLibraryMapping(const char* library_name, + const char* file_id, + uintptr_t start_address, + size_t mapping_length, + size_t file_offset) +{ + if (!gExceptionHandler) { + mapping_info info; + info.name = library_name; + info.debug_id = file_id; + info.start_address = start_address; + info.length = mapping_length; + info.file_offset = file_offset; + library_mappings.push_back(info); + } + else { + u_int8_t guid[sizeof(MDGUID)]; + FileIDToGUID(file_id, guid); + gExceptionHandler->AddMappingInfo(library_name, + guid, + start_address, + mapping_length, + file_offset); + } +} +#endif + } // namespace CrashReporter diff --git a/toolkit/crashreporter/nsExceptionHandler.h b/toolkit/crashreporter/nsExceptionHandler.h index 1eeeedbe5a58..45bbd20f8888 100644 --- a/toolkit/crashreporter/nsExceptionHandler.h +++ b/toolkit/crashreporter/nsExceptionHandler.h @@ -157,6 +157,19 @@ bool SetRemoteExceptionHandler(); bool UnsetRemoteExceptionHandler(); #endif // MOZ_IPC + +#if defined(__ANDROID__) +// Android builds use a custom library loader, so /proc//maps +// will just show anonymous mappings for all the non-system +// shared libraries. This API is to work around that by providing +// info about the shared libraries that are mapped into these anonymous +// mappings. +void AddLibraryMapping(const char* library_name, + const char* file_id, + uintptr_t start_address, + size_t mapping_length, + size_t file_offset); +#endif } #endif /* nsExceptionHandler_h__ */