| OLD | NEW |
| 1 // Copyright (c) 2010, Google Inc. | 1 // Copyright (c) 2010, Google Inc. |
| 2 // All rights reserved. | 2 // All rights reserved. |
| 3 // | 3 // |
| 4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
| 5 // modification, are permitted provided that the following conditions are | 5 // modification, are permitted provided that the following conditions are |
| 6 // met: | 6 // met: |
| 7 // | 7 // |
| 8 // * Redistributions of source code must retain the above copyright | 8 // * Redistributions of source code must retain the above copyright |
| 9 // notice, this list of conditions and the following disclaimer. | 9 // notice, this list of conditions and the following disclaimer. |
| 10 // * Redistributions in binary form must reproduce the above | 10 // * Redistributions in binary form must reproduce the above |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 66 | 66 |
| 67 #include "client/linux/dump_writer_common/thread_info.h" | 67 #include "client/linux/dump_writer_common/thread_info.h" |
| 68 #include "client/linux/dump_writer_common/ucontext_reader.h" | 68 #include "client/linux/dump_writer_common/ucontext_reader.h" |
| 69 #include "client/linux/handler/exception_handler.h" | 69 #include "client/linux/handler/exception_handler.h" |
| 70 #include "client/linux/minidump_writer/cpu_set.h" | 70 #include "client/linux/minidump_writer/cpu_set.h" |
| 71 #include "client/linux/minidump_writer/line_reader.h" | 71 #include "client/linux/minidump_writer/line_reader.h" |
| 72 #include "client/linux/minidump_writer/linux_dumper.h" | 72 #include "client/linux/minidump_writer/linux_dumper.h" |
| 73 #include "client/linux/minidump_writer/linux_ptrace_dumper.h" | 73 #include "client/linux/minidump_writer/linux_ptrace_dumper.h" |
| 74 #include "client/linux/minidump_writer/proc_cpuinfo_reader.h" | 74 #include "client/linux/minidump_writer/proc_cpuinfo_reader.h" |
| 75 #include "client/minidump_file_writer.h" | 75 #include "client/minidump_file_writer.h" |
| 76 #include "common/linux/file_id.h" |
| 76 #include "common/linux/linux_libc_support.h" | 77 #include "common/linux/linux_libc_support.h" |
| 77 #include "common/minidump_type_helper.h" | 78 #include "common/minidump_type_helper.h" |
| 78 #include "google_breakpad/common/minidump_format.h" | 79 #include "google_breakpad/common/minidump_format.h" |
| 79 #include "third_party/lss/linux_syscall_support.h" | 80 #include "third_party/lss/linux_syscall_support.h" |
| 80 | 81 |
| 81 namespace { | 82 namespace { |
| 82 | 83 |
| 83 using google_breakpad::AppMemoryList; | 84 using google_breakpad::AppMemoryList; |
| 85 using google_breakpad::auto_wasteful_vector; |
| 84 using google_breakpad::ExceptionHandler; | 86 using google_breakpad::ExceptionHandler; |
| 85 using google_breakpad::CpuSet; | 87 using google_breakpad::CpuSet; |
| 88 using google_breakpad::kDefaultBuildIdSize; |
| 86 using google_breakpad::LineReader; | 89 using google_breakpad::LineReader; |
| 87 using google_breakpad::LinuxDumper; | 90 using google_breakpad::LinuxDumper; |
| 88 using google_breakpad::LinuxPtraceDumper; | 91 using google_breakpad::LinuxPtraceDumper; |
| 89 using google_breakpad::MDTypeHelper; | 92 using google_breakpad::MDTypeHelper; |
| 90 using google_breakpad::MappingEntry; | 93 using google_breakpad::MappingEntry; |
| 91 using google_breakpad::MappingInfo; | 94 using google_breakpad::MappingInfo; |
| 92 using google_breakpad::MappingList; | 95 using google_breakpad::MappingList; |
| 93 using google_breakpad::MinidumpFileWriter; | 96 using google_breakpad::MinidumpFileWriter; |
| 94 using google_breakpad::PageAllocator; | 97 using google_breakpad::PageAllocator; |
| 95 using google_breakpad::ProcCpuInfoReader; | 98 using google_breakpad::ProcCpuInfoReader; |
| (...skipping 443 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 539 bool FillRawModule(const MappingInfo& mapping, | 542 bool FillRawModule(const MappingInfo& mapping, |
| 540 bool member, | 543 bool member, |
| 541 unsigned int mapping_id, | 544 unsigned int mapping_id, |
| 542 MDRawModule* mod, | 545 MDRawModule* mod, |
| 543 const uint8_t* identifier) { | 546 const uint8_t* identifier) { |
| 544 my_memset(mod, 0, MD_MODULE_SIZE); | 547 my_memset(mod, 0, MD_MODULE_SIZE); |
| 545 | 548 |
| 546 mod->base_of_image = mapping.start_addr; | 549 mod->base_of_image = mapping.start_addr; |
| 547 mod->size_of_image = mapping.size; | 550 mod->size_of_image = mapping.size; |
| 548 | 551 |
| 549 uint8_t cv_buf[MDCVInfoPDB70_minsize + NAME_MAX]; | 552 auto_wasteful_vector<uint8_t, kDefaultBuildIdSize> identifier_bytes( |
| 550 uint8_t* cv_ptr = cv_buf; | 553 dumper_->allocator()); |
| 551 | 554 |
| 552 const uint32_t cv_signature = MD_CVINFOPDB70_SIGNATURE; | |
| 553 my_memcpy(cv_ptr, &cv_signature, sizeof(cv_signature)); | |
| 554 cv_ptr += sizeof(cv_signature); | |
| 555 uint8_t* signature = cv_ptr; | |
| 556 cv_ptr += sizeof(MDGUID); | |
| 557 if (identifier) { | 555 if (identifier) { |
| 558 // GUID was provided by caller. | 556 // GUID was provided by caller. |
| 559 my_memcpy(signature, identifier, sizeof(MDGUID)); | 557 identifier_bytes.insert(identifier_bytes.end(), |
| 558 identifier, |
| 559 identifier + sizeof(MDGUID)); |
| 560 } else { | 560 } else { |
| 561 // Note: ElfFileIdentifierForMapping() can manipulate the |mapping.name|. | 561 // Note: ElfFileIdentifierForMapping() can manipulate the |mapping.name|. |
| 562 dumper_->ElfFileIdentifierForMapping(mapping, member, | 562 dumper_->ElfFileIdentifierForMapping(mapping, |
| 563 mapping_id, signature); | 563 member, |
| 564 mapping_id, |
| 565 identifier_bytes); |
| 564 } | 566 } |
| 565 my_memset(cv_ptr, 0, sizeof(uint32_t)); // Set age to 0 on Linux. | 567 |
| 566 cv_ptr += sizeof(uint32_t); | 568 if (!identifier_bytes.empty()) { |
| 569 UntypedMDRVA cv(&minidump_writer_); |
| 570 if (!cv.Allocate(MDCVInfoELF_minsize + identifier_bytes.size())) |
| 571 return false; |
| 572 |
| 573 const uint32_t cv_signature = MD_CVINFOELF_SIGNATURE; |
| 574 cv.Copy(&cv_signature, sizeof(cv_signature)); |
| 575 cv.Copy(cv.position() + sizeof(cv_signature), &identifier_bytes[0], |
| 576 identifier_bytes.size()); |
| 577 |
| 578 mod->cv_record = cv.location(); |
| 579 } |
| 567 | 580 |
| 568 char file_name[NAME_MAX]; | 581 char file_name[NAME_MAX]; |
| 569 char file_path[NAME_MAX]; | 582 char file_path[NAME_MAX]; |
| 570 dumper_->GetMappingEffectiveNameAndPath( | 583 dumper_->GetMappingEffectiveNameAndPath( |
| 571 mapping, file_path, sizeof(file_path), file_name, sizeof(file_name)); | 584 mapping, file_path, sizeof(file_path), file_name, sizeof(file_name)); |
| 572 | 585 |
| 573 const size_t file_name_len = my_strlen(file_name); | |
| 574 UntypedMDRVA cv(&minidump_writer_); | |
| 575 if (!cv.Allocate(MDCVInfoPDB70_minsize + file_name_len + 1)) | |
| 576 return false; | |
| 577 | |
| 578 // Write pdb_file_name | |
| 579 my_memcpy(cv_ptr, file_name, file_name_len + 1); | |
| 580 cv.Copy(cv_buf, MDCVInfoPDB70_minsize + file_name_len + 1); | |
| 581 | |
| 582 mod->cv_record = cv.location(); | |
| 583 | |
| 584 MDLocationDescriptor ld; | 586 MDLocationDescriptor ld; |
| 585 if (!minidump_writer_.WriteString(file_path, my_strlen(file_path), &ld)) | 587 if (!minidump_writer_.WriteString(file_path, my_strlen(file_path), &ld)) |
| 586 return false; | 588 return false; |
| 587 mod->module_name_rva = ld.rva; | 589 mod->module_name_rva = ld.rva; |
| 588 return true; | 590 return true; |
| 589 } | 591 } |
| 590 | 592 |
| 591 bool WriteMemoryListStream(MDRawDirectory* dirent) { | 593 bool WriteMemoryListStream(MDRawDirectory* dirent) { |
| 592 TypedMDRVA<uint32_t> list(&minidump_writer_); | 594 TypedMDRVA<uint32_t> list(&minidump_writer_); |
| 593 if (memory_blocks_.size()) { | 595 if (memory_blocks_.size()) { |
| (...skipping 764 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1358 const MappingList& mappings, | 1360 const MappingList& mappings, |
| 1359 const AppMemoryList& appmem, | 1361 const AppMemoryList& appmem, |
| 1360 LinuxDumper* dumper) { | 1362 LinuxDumper* dumper) { |
| 1361 MinidumpWriter writer(filename, -1, NULL, mappings, appmem, dumper); | 1363 MinidumpWriter writer(filename, -1, NULL, mappings, appmem, dumper); |
| 1362 if (!writer.Init()) | 1364 if (!writer.Init()) |
| 1363 return false; | 1365 return false; |
| 1364 return writer.Dump(); | 1366 return writer.Dump(); |
| 1365 } | 1367 } |
| 1366 | 1368 |
| 1367 } // namespace google_breakpad | 1369 } // namespace google_breakpad |
| OLD | NEW |