Write adjusted range back to module

In Android, the mmap could be overlapped by /dev/ashmem, we adjusted
the range in https://breakpad.appspot.com/9744002/, but adjusted
range isn't written back to module, this caused the corresponding
module be dropped in BasicCodeModules copy constructor.

This also fix a lot of 'unable to store module' warnings
when dumping Android's minidump.

BUG=606972
R=mark@chromium.org, wfh@chromium.org

Review URL: https://codereview.chromium.org/1939333002 .

Patch from Tao Bai <michaelbai@chromium.org>.
This commit is contained in:
Tao Bai 2016-05-03 18:14:28 -04:00 committed by Mark Mentovai
parent fcb844ee32
commit 4f417c8c0f
2 changed files with 13 additions and 0 deletions

View file

@ -382,6 +382,11 @@ class MinidumpModule : public MinidumpObject,
const MDRawModule* module() const { return valid_ ? &module_ : NULL; } const MDRawModule* module() const { return valid_ ? &module_ : NULL; }
// This method is intented to handle the case on Android where the module
// could overlap with ashmem, and is not supposed to be used in anywhere
// else.
void set_base_address_and_size(uint64_t base_address, uint64_t size);
// CodeModule implementation // CodeModule implementation
virtual uint64_t base_address() const { virtual uint64_t base_address() const {
return valid_ ? module_.base_of_image : static_cast<uint64_t>(-1); return valid_ ? module_.base_of_image : static_cast<uint64_t>(-1);

View file

@ -2327,6 +2327,13 @@ const MDImageDebugMisc* MinidumpModule::GetMiscRecord(uint32_t* size) {
return reinterpret_cast<MDImageDebugMisc*>(&(*misc_record_)[0]); return reinterpret_cast<MDImageDebugMisc*>(&(*misc_record_)[0]);
} }
void MinidumpModule::set_base_address_and_size(uint64_t base_address,
uint64_t size) {
if (valid_) {
module_.base_of_image = base_address;
module_.size_of_image = size;
}
}
void MinidumpModule::Print() { void MinidumpModule::Print() {
if (!valid_) { if (!valid_) {
@ -2635,6 +2642,7 @@ bool MinidumpModuleList::Read(uint32_t expected_size) {
HexString(module_size) << ", after adjusting"; HexString(module_size) << ", after adjusting";
return false; return false;
} }
module->set_base_address_and_size(base_address, module_size);
} else { } else {
BPLOG(ERROR) << "MinidumpModuleList could not store module " << BPLOG(ERROR) << "MinidumpModuleList could not store module " <<
module_index << "/" << module_count << ", " << module_index << "/" << module_count << ", " <<