Index: minidump/minidump_module_writer.cc |
diff --git a/minidump/minidump_module_writer.cc b/minidump/minidump_module_writer.cc |
index 0543e3a68469cdb8d050b59944190b7871441480..433121ba5164df2dbddc6c87f6db834548f3b086 100644 |
--- a/minidump/minidump_module_writer.cc |
+++ b/minidump/minidump_module_writer.cc |
@@ -16,10 +16,14 @@ |
#include <sys/types.h> |
+#include <limits> |
+ |
#include "base/logging.h" |
#include "minidump/minidump_string_writer.h" |
#include "minidump/minidump_writer_util.h" |
+#include "snapshot/module_snapshot.h" |
#include "util/file/file_writer.h" |
+#include "util/numeric/in_range_cast.h" |
#include "util/numeric/safe_assignment.h" |
namespace crashpad { |
@@ -96,6 +100,25 @@ MinidumpModuleCodeViewRecordPDB70Writer:: |
~MinidumpModuleCodeViewRecordPDB70Writer() { |
} |
+void MinidumpModuleCodeViewRecordPDB70Writer::InitializeFromSnapshot( |
+ const ModuleSnapshot* module_snapshot) { |
+ DCHECK_EQ(state(), kStateMutable); |
+ |
+ std::string name = module_snapshot->Name(); |
+ std::string leaf_name; |
+ size_t last_slash = name.find_last_of('/'); |
+ if (last_slash != std::string::npos) { |
+ leaf_name = name.substr(last_slash + 1); |
+ } else { |
+ leaf_name = name; |
+ } |
+ SetPDBName(leaf_name); |
+ |
+ UUID uuid; |
+ module_snapshot->UUID(&uuid); |
+ SetUUIDAndAge(uuid, 0); |
+} |
+ |
MinidumpModuleMiscDebugRecordWriter::MinidumpModuleMiscDebugRecordWriter() |
: internal::MinidumpWritable(), |
image_debug_misc_(), |
@@ -186,6 +209,48 @@ MinidumpModuleWriter::MinidumpModuleWriter() |
MinidumpModuleWriter::~MinidumpModuleWriter() { |
} |
+void MinidumpModuleWriter::InitializeFromSnapshot( |
+ const ModuleSnapshot* module_snapshot) { |
+ DCHECK_EQ(state(), kStateMutable); |
+ DCHECK(!name_); |
+ DCHECK(!codeview_record_); |
+ DCHECK(!misc_debug_record_); |
+ |
+ SetName(module_snapshot->Name()); |
+ |
+ SetImageBaseAddress(module_snapshot->Address()); |
+ SetImageSize(InRangeCast<uint32_t>(module_snapshot->Size(), |
+ std::numeric_limits<uint32_t>::max())); |
+ SetTimestamp(module_snapshot->Timestamp()); |
+ |
+ uint16_t v[4]; |
+ module_snapshot->FileVersion(&v[0], &v[1], &v[2], &v[3]); |
+ SetFileVersion(v[0], v[1], v[2], v[3]); |
+ |
+ module_snapshot->SourceVersion(&v[0], &v[1], &v[2], &v[3]); |
+ SetProductVersion(v[0], v[1], v[2], v[3]); |
+ |
+ uint32_t file_type; |
+ switch (module_snapshot->GetModuleType()) { |
+ case ModuleSnapshot::kModuleTypeExecutable: |
+ file_type = VFT_APP; |
+ break; |
+ case ModuleSnapshot::kModuleTypeSharedLibrary: |
+ case ModuleSnapshot::kModuleTypeLoadableModule: |
+ file_type = VFT_DLL; |
+ break; |
+ default: |
+ file_type = VFT_UNKNOWN; |
+ break; |
+ } |
+ SetFileTypeAndSubtype(file_type, VFT2_UNKNOWN); |
+ |
+ auto codeview_record = |
+ make_scoped_ptr(new MinidumpModuleCodeViewRecordPDB70Writer()); |
+ codeview_record->InitializeFromSnapshot(module_snapshot); |
+ SetCodeViewRecord(codeview_record.Pass()); |
+} |
+ |
const MINIDUMP_MODULE* MinidumpModuleWriter::MinidumpModule() const { |
DCHECK_EQ(state(), kStateWritable); |
@@ -316,6 +381,18 @@ MinidumpModuleListWriter::MinidumpModuleListWriter() |
MinidumpModuleListWriter::~MinidumpModuleListWriter() { |
} |
+void MinidumpModuleListWriter::InitializeFromSnapshot( |
+ const std::vector<const ModuleSnapshot*>& module_snapshots) { |
+ DCHECK_EQ(state(), kStateMutable); |
+ DCHECK(modules_.empty()); |
+ |
+ for (const ModuleSnapshot* module_snapshot : module_snapshots) { |
+ auto module = make_scoped_ptr(new MinidumpModuleWriter()); |
+ module->InitializeFromSnapshot(module_snapshot); |
+ AddModule(module.Pass()); |
+ } |
+} |
+ |
void MinidumpModuleListWriter::AddModule( |
scoped_ptr<MinidumpModuleWriter> module) { |
DCHECK_EQ(state(), kStateMutable); |