diff options
author | ted.mielczarek@gmail.com <ted.mielczarek@gmail.com@4c0a9323-5329-0410-9bdc-e9ce6186880e> | 2012-09-18 13:54:58 +0000 |
---|---|---|
committer | ted.mielczarek@gmail.com <ted.mielczarek@gmail.com@4c0a9323-5329-0410-9bdc-e9ce6186880e> | 2012-09-18 13:54:58 +0000 |
commit | 61d9b9ff9626bf57c68a12c53c6e4804b8ef93d8 (patch) | |
tree | c85f99a0216bb237a36c59af6f196ca79e91e418 /src/client/linux/minidump_writer/minidump_writer.cc | |
parent | Change an always true comparison to another conditional. Since (diff) | |
download | breakpad-61d9b9ff9626bf57c68a12c53c6e4804b8ef93d8.tar.xz |
Allow adding extra memory regions to minidump on linux/windows
A=Bill McCloskey <wmccloskey@mozilla.com>, ted, original patch from https://bugzilla.mozilla.org/show_bug.cgi?id=662646
R=mark at https://breakpad.appspot.com/450002/
git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@1041 4c0a9323-5329-0410-9bdc-e9ce6186880e
Diffstat (limited to 'src/client/linux/minidump_writer/minidump_writer.cc')
-rw-r--r-- | src/client/linux/minidump_writer/minidump_writer.cc | 58 |
1 files changed, 48 insertions, 10 deletions
diff --git a/src/client/linux/minidump_writer/minidump_writer.cc b/src/client/linux/minidump_writer/minidump_writer.cc index eb2e6d64..b081b298 100644 --- a/src/client/linux/minidump_writer/minidump_writer.cc +++ b/src/client/linux/minidump_writer/minidump_writer.cc @@ -76,6 +76,7 @@ namespace { +using google_breakpad::AppMemoryList; using google_breakpad::ExceptionHandler; using google_breakpad::LineReader; using google_breakpad::LinuxDumper; @@ -381,6 +382,7 @@ class MinidumpWriter { int minidump_fd, const ExceptionHandler::CrashContext* context, const MappingList& mappings, + const AppMemoryList& appmem, LinuxDumper* dumper) : fd_(minidump_fd), path_(minidump_path), @@ -393,7 +395,8 @@ class MinidumpWriter { #endif dumper_(dumper), memory_blocks_(dumper_->allocator()), - mapping_list_(mappings) { + mapping_list_(mappings), + app_memory_list_(appmem) { // Assert there should be either a valid fd or a valid path, not both. assert(fd_ != -1 || minidump_path); assert(fd_ == -1 || !minidump_path); @@ -480,6 +483,9 @@ class MinidumpWriter { return false; dir.CopyIndex(dir_index++, &dirent); + if (!WriteAppMemory()) + return false; + if (!WriteMemoryListStream(&dirent)) return false; dir.CopyIndex(dir_index++, &dirent); @@ -781,6 +787,30 @@ class MinidumpWriter { return true; } + // Write application-provided memory regions. + bool WriteAppMemory() { + for (AppMemoryList::const_iterator iter = app_memory_list_.begin(); + iter != app_memory_list_.end(); + ++iter) { + uint8_t* data_copy = + reinterpret_cast<uint8_t*>(dumper_->allocator()->Alloc(iter->length)); + dumper_->CopyFromProcess(data_copy, GetCrashThread(), iter->ptr, + iter->length); + + UntypedMDRVA memory(&minidump_writer_); + if (!memory.Allocate(iter->length)) { + return false; + } + memory.Copy(data_copy, iter->length); + MDMemoryDescriptor desc; + desc.start_of_memory_range = reinterpret_cast<uintptr_t>(iter->ptr); + desc.memory = memory.location(); + memory_blocks_.push_back(desc); + } + + return true; + } + static bool ShouldIncludeMapping(const MappingInfo& mapping) { if (mapping.name[0] == 0 || // only want modules with filenames. mapping.offset || // only want to include one mapping per shared lib. @@ -1361,6 +1391,9 @@ class MinidumpWriter { wasteful_vector<MDMemoryDescriptor> memory_blocks_; // Additional information about some mappings provided by the caller. const MappingList& mapping_list_; + // Additional memory regions to be included in the dump, + // provided by the caller. + const AppMemoryList& app_memory_list_; }; @@ -1368,7 +1401,8 @@ bool WriteMinidumpImpl(const char* minidump_path, int minidump_fd, pid_t crashing_process, const void* blob, size_t blob_size, - const MappingList& mappings) { + const MappingList& mappings, + const AppMemoryList& appmem) { if (blob_size != sizeof(ExceptionHandler::CrashContext)) return false; const ExceptionHandler::CrashContext* context = @@ -1378,7 +1412,8 @@ bool WriteMinidumpImpl(const char* minidump_path, reinterpret_cast<uintptr_t>(context->siginfo.si_addr)); dumper.set_crash_signal(context->siginfo.si_signo); dumper.set_crash_thread(context->tid); - MinidumpWriter writer(minidump_path, minidump_fd, context, mappings, &dumper); + MinidumpWriter writer(minidump_path, minidump_fd, context, mappings, + appmem, &dumper); if (!writer.Init()) return false; return writer.Dump(); @@ -1391,33 +1426,36 @@ namespace google_breakpad { bool WriteMinidump(const char* minidump_path, pid_t crashing_process, const void* blob, size_t blob_size) { return WriteMinidumpImpl(minidump_path, -1, crashing_process, blob, blob_size, - MappingList()); + MappingList(), AppMemoryList()); } bool WriteMinidump(int minidump_fd, pid_t crashing_process, const void* blob, size_t blob_size) { return WriteMinidumpImpl(NULL, minidump_fd, crashing_process, blob, blob_size, - MappingList()); + MappingList(), AppMemoryList()); } bool WriteMinidump(const char* minidump_path, pid_t crashing_process, const void* blob, size_t blob_size, - const MappingList& mappings) { + const MappingList& mappings, + const AppMemoryList& appmem) { return WriteMinidumpImpl(minidump_path, -1, crashing_process, blob, blob_size, - mappings); + mappings, appmem); } bool WriteMinidump(int minidump_fd, pid_t crashing_process, const void* blob, size_t blob_size, - const MappingList& mappings) { + const MappingList& mappings, + const AppMemoryList& appmem) { return WriteMinidumpImpl(NULL, minidump_fd, crashing_process, blob, blob_size, - mappings); + mappings, appmem); } bool WriteMinidump(const char* filename, const MappingList& mappings, + const AppMemoryList& appmem, LinuxDumper* dumper) { - MinidumpWriter writer(filename, -1, NULL, mappings, dumper); + MinidumpWriter writer(filename, -1, NULL, mappings, appmem, dumper); if (!writer.Init()) return false; return writer.Dump(); |