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

This commit is contained in:
Ted Mielczarek 2010-10-19 15:05:47 -04:00
parent ff5e15723d
commit 7c96c0ef20
3 changed files with 85 additions and 3 deletions

View File

@ -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();

View File

@ -103,6 +103,7 @@
#include "nsInterfaceHashtable.h"
#include "prprf.h"
#include "nsIXULAppInfo.h"
#include <vector>
#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<mapping_info> 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

View File

@ -157,6 +157,19 @@ bool SetRemoteExceptionHandler();
bool UnsetRemoteExceptionHandler();
#endif // MOZ_IPC
#if defined(__ANDROID__)
// Android builds use a custom library loader, so /proc/<pid>/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__ */