mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-16 14:55:47 +00:00
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:
parent
ff5e15723d
commit
7c96c0ef20
@ -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();
|
||||
|
@ -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
|
||||
|
@ -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__ */
|
||||
|
Loading…
Reference in New Issue
Block a user