aboutsummaryrefslogtreecommitdiff
path: root/src/client/linux/minidump_writer/minidump_writer.cc
diff options
context:
space:
mode:
authorted.mielczarek@gmail.com <ted.mielczarek@gmail.com@4c0a9323-5329-0410-9bdc-e9ce6186880e>2012-09-18 13:54:58 +0000
committerted.mielczarek@gmail.com <ted.mielczarek@gmail.com@4c0a9323-5329-0410-9bdc-e9ce6186880e>2012-09-18 13:54:58 +0000
commit61d9b9ff9626bf57c68a12c53c6e4804b8ef93d8 (patch)
treec85f99a0216bb237a36c59af6f196ca79e91e418 /src/client/linux/minidump_writer/minidump_writer.cc
parentChange an always true comparison to another conditional. Since (diff)
downloadbreakpad-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.cc58
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();