Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(101)

Side by Side Diff: src/client/linux/minidump_writer/minidump_writer.cc

Issue 1688743002: Switch the Linux minidump writer to use MDCVInfoELF for CV data. (Closed) Base URL: https://chromium.googlesource.com/breakpad/breakpad.git@master
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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;
84 using google_breakpad::ExceptionHandler; 85 using google_breakpad::ExceptionHandler;
85 using google_breakpad::CpuSet; 86 using google_breakpad::CpuSet;
87 using google_breakpad::kMaxBuildID;
86 using google_breakpad::LineReader; 88 using google_breakpad::LineReader;
87 using google_breakpad::LinuxDumper; 89 using google_breakpad::LinuxDumper;
88 using google_breakpad::LinuxPtraceDumper; 90 using google_breakpad::LinuxPtraceDumper;
89 using google_breakpad::MDTypeHelper; 91 using google_breakpad::MDTypeHelper;
90 using google_breakpad::MappingEntry; 92 using google_breakpad::MappingEntry;
91 using google_breakpad::MappingInfo; 93 using google_breakpad::MappingInfo;
92 using google_breakpad::MappingList; 94 using google_breakpad::MappingList;
93 using google_breakpad::MinidumpFileWriter; 95 using google_breakpad::MinidumpFileWriter;
94 using google_breakpad::PageAllocator; 96 using google_breakpad::PageAllocator;
95 using google_breakpad::ProcCpuInfoReader; 97 using google_breakpad::ProcCpuInfoReader;
(...skipping 436 matching lines...) Expand 10 before | Expand all | Expand 10 after
532 bool FillRawModule(const MappingInfo& mapping, 534 bool FillRawModule(const MappingInfo& mapping,
533 bool member, 535 bool member,
534 unsigned int mapping_id, 536 unsigned int mapping_id,
535 MDRawModule* mod, 537 MDRawModule* mod,
536 const uint8_t* identifier) { 538 const uint8_t* identifier) {
537 my_memset(mod, 0, MD_MODULE_SIZE); 539 my_memset(mod, 0, MD_MODULE_SIZE);
538 540
539 mod->base_of_image = mapping.start_addr; 541 mod->base_of_image = mapping.start_addr;
540 mod->size_of_image = mapping.size; 542 mod->size_of_image = mapping.size;
541 543
542 uint8_t cv_buf[MDCVInfoPDB70_minsize + NAME_MAX]; 544 uint8_t cv_buf[MDCVInfoELF_minsize + kMaxBuildID];
543 uint8_t* cv_ptr = cv_buf; 545 uint8_t* cv_ptr = cv_buf;
544 546
545 const uint32_t cv_signature = MD_CVINFOPDB70_SIGNATURE; 547 const uint32_t cv_signature = MD_CVINFOELF_SIGNATURE;
546 my_memcpy(cv_ptr, &cv_signature, sizeof(cv_signature)); 548 my_memcpy(cv_ptr, &cv_signature, sizeof(cv_signature));
547 cv_ptr += sizeof(cv_signature); 549 cv_ptr += sizeof(cv_signature);
548 uint8_t* signature = cv_ptr; 550 uint8_t* signature = cv_ptr;
549 cv_ptr += sizeof(MDGUID); 551 size_t signature_length = 0;
550 if (identifier) { 552 if (identifier) {
551 // GUID was provided by caller. 553 // GUID was provided by caller.
552 my_memcpy(signature, identifier, sizeof(MDGUID)); 554 my_memcpy(signature, identifier, sizeof(MDGUID));
555 signature_length = sizeof(MDGUID);
553 } else { 556 } else {
554 // Note: ElfFileIdentifierForMapping() can manipulate the |mapping.name|. 557 // Note: ElfFileIdentifierForMapping() can manipulate the |mapping.name|.
555 dumper_->ElfFileIdentifierForMapping(mapping, member, 558 dumper_->ElfFileIdentifierForMapping(mapping,
556 mapping_id, signature); 559 member,
560 mapping_id,
561 signature,
562 &signature_length);
557 } 563 }
558 my_memset(cv_ptr, 0, sizeof(uint32_t)); // Set age to 0 on Linux. 564 UntypedMDRVA cv(&minidump_writer_);
559 cv_ptr += sizeof(uint32_t); 565 if (!cv.Allocate(MDCVInfoELF_minsize + signature_length))
566 return false;
567
568 cv.Copy(cv_buf, MDCVInfoELF_minsize + signature_length);
569
570 mod->cv_record = cv.location();
560 571
561 char file_name[NAME_MAX]; 572 char file_name[NAME_MAX];
562 char file_path[NAME_MAX]; 573 char file_path[NAME_MAX];
563 LinuxDumper::GetMappingEffectiveNameAndPath( 574 LinuxDumper::GetMappingEffectiveNameAndPath(
564 mapping, file_path, sizeof(file_path), file_name, sizeof(file_name)); 575 mapping, file_path, sizeof(file_path), file_name, sizeof(file_name));
565 576
566 const size_t file_name_len = my_strlen(file_name);
567 UntypedMDRVA cv(&minidump_writer_);
568 if (!cv.Allocate(MDCVInfoPDB70_minsize + file_name_len + 1))
569 return false;
570
571 // Write pdb_file_name
572 my_memcpy(cv_ptr, file_name, file_name_len + 1);
573 cv.Copy(cv_buf, MDCVInfoPDB70_minsize + file_name_len + 1);
574
575 mod->cv_record = cv.location();
576
577 MDLocationDescriptor ld; 577 MDLocationDescriptor ld;
578 if (!minidump_writer_.WriteString(file_path, my_strlen(file_path), &ld)) 578 if (!minidump_writer_.WriteString(file_path, my_strlen(file_path), &ld))
579 return false; 579 return false;
580 mod->module_name_rva = ld.rva; 580 mod->module_name_rva = ld.rva;
581 return true; 581 return true;
582 } 582 }
583 583
584 bool WriteMemoryListStream(MDRawDirectory* dirent) { 584 bool WriteMemoryListStream(MDRawDirectory* dirent) {
585 TypedMDRVA<uint32_t> list(&minidump_writer_); 585 TypedMDRVA<uint32_t> list(&minidump_writer_);
586 if (memory_blocks_.size()) { 586 if (memory_blocks_.size()) {
(...skipping 764 matching lines...) Expand 10 before | Expand all | Expand 10 after
1351 const MappingList& mappings, 1351 const MappingList& mappings,
1352 const AppMemoryList& appmem, 1352 const AppMemoryList& appmem,
1353 LinuxDumper* dumper) { 1353 LinuxDumper* dumper) {
1354 MinidumpWriter writer(filename, -1, NULL, mappings, appmem, dumper); 1354 MinidumpWriter writer(filename, -1, NULL, mappings, appmem, dumper);
1355 if (!writer.Init()) 1355 if (!writer.Init())
1356 return false; 1356 return false;
1357 return writer.Dump(); 1357 return writer.Dump();
1358 } 1358 }
1359 1359
1360 } // namespace google_breakpad 1360 } // namespace google_breakpad
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698