| Index: src/processor/minidump.cc
|
| ===================================================================
|
| --- src/processor/minidump.cc (revision 1462)
|
| +++ src/processor/minidump.cc (working copy)
|
| @@ -2517,6 +2517,7 @@
|
| // MinidumpModule::ReadAuxiliaryData seeks around, and if it were
|
| // included in the loop above, additional seeks would be needed where
|
| // none are now to read contiguous data.
|
| + uint64_t last_end_address = 0;
|
| for (unsigned int module_index = 0;
|
| module_index < module_count;
|
| ++module_index) {
|
| @@ -2554,12 +2555,29 @@
|
| const string kDevAshmem("/dev/ashmem/");
|
| if (module->code_file().compare(
|
| 0, kDevAshmem.length(), kDevAshmem) != 0) {
|
| - BPLOG(ERROR) << "MinidumpModuleList could not store module " <<
|
| - module_index << "/" << module_count << ", " <<
|
| - module->code_file() << ", " <<
|
| - HexString(base_address) << "+" <<
|
| - HexString(module_size);
|
| - return false;
|
| + if (base_address < last_end_address) {
|
| + // If failed due to apparent range overlap the cause may be
|
| + // the client correction applied for Android packed relocations.
|
| + // If this is the case, back out the client correction and retry.
|
| + module_size -= last_end_address - base_address;
|
| + base_address = last_end_address;
|
| + if (!range_map_->StoreRange(base_address,
|
| + module_size, module_index)) {
|
| + BPLOG(ERROR) << "MinidumpModuleList could not store module " <<
|
| + module_index << "/" << module_count << ", " <<
|
| + module->code_file() << ", " <<
|
| + HexString(base_address) << "+" <<
|
| + HexString(module_size) << ", after adjusting";
|
| + return false;
|
| + }
|
| + } else {
|
| + BPLOG(ERROR) << "MinidumpModuleList could not store module " <<
|
| + module_index << "/" << module_count << ", " <<
|
| + module->code_file() << ", " <<
|
| + HexString(base_address) << "+" <<
|
| + HexString(module_size);
|
| + return false;
|
| + }
|
| } else {
|
| BPLOG(INFO) << "MinidumpModuleList ignoring overlapping module " <<
|
| module_index << "/" << module_count << ", " <<
|
| @@ -2568,6 +2586,7 @@
|
| HexString(module_size);
|
| }
|
| }
|
| + last_end_address = base_address + module_size;
|
| }
|
|
|
| modules_ = modules.release();
|
|
|