mirror of
https://github.com/chromium/crashpad.git
synced 2025-03-10 06:36:02 +00:00
Add direct includes for things provided transitively by logging.h (or by other headers including logging.h). This is in preparation for cleaning up unnecessary includes of logging.h in header files (so if something depends on logging.h, it needs include it explicitly), and for when Chromium's logging.h no longer includes check.h, check_op.h, and notreached.h. DEPS is also updated to roll mini_chromium to ae14a14ab4 which includes these new header files. Bug: chromium:1031540 Change-Id: I36f646d0a93854989dc602d0dc7139dd7a7b8621 Reviewed-on: https://chromium-review.googlesource.com/c/crashpad/crashpad/+/2250251 Commit-Queue: Hans Wennborg <hans@chromium.org> Reviewed-by: Mark Mentovai <mark@chromium.org>
291 lines
9.0 KiB
C++
291 lines
9.0 KiB
C++
// Copyright 2015 The Crashpad Authors. All rights reserved.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
#include "snapshot/minidump/module_snapshot_minidump.h"
|
|
|
|
#include <stddef.h>
|
|
#include <string.h>
|
|
|
|
#include "base/logging.h"
|
|
#include "base/notreached.h"
|
|
#include "minidump/minidump_extensions.h"
|
|
#include "snapshot/minidump/minidump_annotation_reader.h"
|
|
#include "snapshot/minidump/minidump_simple_string_dictionary_reader.h"
|
|
#include "snapshot/minidump/minidump_string_list_reader.h"
|
|
#include "snapshot/minidump/minidump_string_reader.h"
|
|
#include "util/misc/pdb_structures.h"
|
|
|
|
namespace crashpad {
|
|
namespace internal {
|
|
|
|
ModuleSnapshotMinidump::ModuleSnapshotMinidump()
|
|
: ModuleSnapshot(),
|
|
minidump_module_(),
|
|
annotations_vector_(),
|
|
annotations_simple_map_(),
|
|
annotation_objects_(),
|
|
uuid_(),
|
|
build_id_(),
|
|
name_(),
|
|
debug_file_name_(),
|
|
age_(0),
|
|
initialized_() {}
|
|
|
|
ModuleSnapshotMinidump::~ModuleSnapshotMinidump() {}
|
|
|
|
bool ModuleSnapshotMinidump::Initialize(
|
|
FileReaderInterface* file_reader,
|
|
RVA minidump_module_rva,
|
|
const MINIDUMP_LOCATION_DESCRIPTOR*
|
|
minidump_module_crashpad_info_location) {
|
|
INITIALIZATION_STATE_SET_INITIALIZING(initialized_);
|
|
|
|
if (!file_reader->SeekSet(minidump_module_rva)) {
|
|
return false;
|
|
}
|
|
|
|
if (!file_reader->ReadExactly(&minidump_module_, sizeof(minidump_module_))) {
|
|
return false;
|
|
}
|
|
|
|
if (!InitializeModuleCrashpadInfo(file_reader,
|
|
minidump_module_crashpad_info_location)) {
|
|
return false;
|
|
}
|
|
|
|
ReadMinidumpUTF16String(file_reader, minidump_module_.ModuleNameRva, &name_);
|
|
|
|
if (minidump_module_.CvRecord.Rva != 0 &&
|
|
!InitializeModuleCodeView(file_reader)) {
|
|
return false;
|
|
}
|
|
|
|
INITIALIZATION_STATE_SET_VALID(initialized_);
|
|
return true;
|
|
}
|
|
|
|
bool ModuleSnapshotMinidump::InitializeModuleCodeView(
|
|
FileReaderInterface* file_reader) {
|
|
uint32_t signature;
|
|
|
|
DCHECK_NE(minidump_module_.CvRecord.Rva, 0u);
|
|
|
|
if (minidump_module_.CvRecord.DataSize < sizeof(signature)) {
|
|
LOG(ERROR) << "CodeView record in module too small to contain signature";
|
|
return false;
|
|
}
|
|
|
|
if (!file_reader->SeekSet(minidump_module_.CvRecord.Rva)) {
|
|
return false;
|
|
}
|
|
|
|
std::vector<uint8_t> cv_record;
|
|
cv_record.resize(minidump_module_.CvRecord.DataSize);
|
|
|
|
if (!file_reader->ReadExactly(cv_record.data(), cv_record.size())) {
|
|
return false;
|
|
}
|
|
|
|
signature = *reinterpret_cast<uint32_t*>(cv_record.data());
|
|
|
|
if (signature == CodeViewRecordPDB70::kSignature) {
|
|
if (cv_record.size() < offsetof(CodeViewRecordPDB70, pdb_name)) {
|
|
LOG(ERROR) << "CodeView record in module marked as PDB70 but too small";
|
|
return false;
|
|
}
|
|
|
|
auto cv_record_pdb70 =
|
|
reinterpret_cast<CodeViewRecordPDB70*>(cv_record.data());
|
|
|
|
age_ = cv_record_pdb70->age;
|
|
uuid_ = cv_record_pdb70->uuid;
|
|
|
|
std::copy(cv_record.begin() + offsetof(CodeViewRecordPDB70, pdb_name),
|
|
cv_record.end(),
|
|
std::back_inserter(debug_file_name_));
|
|
return true;
|
|
}
|
|
|
|
if (signature == CodeViewRecordBuildID::kSignature) {
|
|
std::copy(cv_record.begin() + offsetof(CodeViewRecordBuildID, build_id),
|
|
cv_record.end(),
|
|
std::back_inserter(build_id_));
|
|
return true;
|
|
}
|
|
|
|
LOG(ERROR) << "Bad CodeView signature in module";
|
|
return false;
|
|
}
|
|
|
|
std::string ModuleSnapshotMinidump::Name() const {
|
|
INITIALIZATION_STATE_DCHECK_VALID(initialized_);
|
|
return name_;
|
|
}
|
|
|
|
uint64_t ModuleSnapshotMinidump::Address() const {
|
|
INITIALIZATION_STATE_DCHECK_VALID(initialized_);
|
|
return minidump_module_.BaseOfImage;
|
|
}
|
|
|
|
uint64_t ModuleSnapshotMinidump::Size() const {
|
|
INITIALIZATION_STATE_DCHECK_VALID(initialized_);
|
|
return minidump_module_.SizeOfImage;
|
|
}
|
|
|
|
time_t ModuleSnapshotMinidump::Timestamp() const {
|
|
return minidump_module_.TimeDateStamp;
|
|
}
|
|
|
|
void ModuleSnapshotMinidump::FileVersion(uint16_t* version_0,
|
|
uint16_t* version_1,
|
|
uint16_t* version_2,
|
|
uint16_t* version_3) const {
|
|
INITIALIZATION_STATE_DCHECK_VALID(initialized_);
|
|
uint32_t version_01 = minidump_module_.VersionInfo.dwFileVersionMS;
|
|
uint32_t version_23 = minidump_module_.VersionInfo.dwFileVersionLS;
|
|
*version_0 = static_cast<uint16_t>(version_01 >> 16);
|
|
*version_1 = static_cast<uint16_t>(version_01 & 0xFFFF);
|
|
*version_2 = static_cast<uint16_t>(version_23 >> 16);
|
|
*version_3 = static_cast<uint16_t>(version_23 & 0xFFFF);
|
|
}
|
|
|
|
void ModuleSnapshotMinidump::SourceVersion(uint16_t* version_0,
|
|
uint16_t* version_1,
|
|
uint16_t* version_2,
|
|
uint16_t* version_3) const {
|
|
INITIALIZATION_STATE_DCHECK_VALID(initialized_);
|
|
uint32_t version_01 = minidump_module_.VersionInfo.dwProductVersionMS;
|
|
uint32_t version_23 = minidump_module_.VersionInfo.dwProductVersionLS;
|
|
*version_0 = static_cast<uint16_t>(version_01 >> 16);
|
|
*version_1 = static_cast<uint16_t>(version_01 & 0xFFFF);
|
|
*version_2 = static_cast<uint16_t>(version_23 >> 16);
|
|
*version_3 = static_cast<uint16_t>(version_23 & 0xFFFF);
|
|
}
|
|
|
|
ModuleSnapshot::ModuleType ModuleSnapshotMinidump::GetModuleType() const {
|
|
INITIALIZATION_STATE_DCHECK_VALID(initialized_);
|
|
switch (minidump_module_.VersionInfo.dwFileType) {
|
|
case VFT_APP:
|
|
return kModuleTypeExecutable;
|
|
case VFT_DLL:
|
|
return kModuleTypeSharedLibrary;
|
|
}
|
|
return kModuleTypeUnknown;
|
|
}
|
|
|
|
void ModuleSnapshotMinidump::UUIDAndAge(crashpad::UUID* uuid,
|
|
uint32_t* age) const {
|
|
INITIALIZATION_STATE_DCHECK_VALID(initialized_);
|
|
*uuid = uuid_;
|
|
*age = age_;
|
|
}
|
|
|
|
std::string ModuleSnapshotMinidump::DebugFileName() const {
|
|
INITIALIZATION_STATE_DCHECK_VALID(initialized_);
|
|
return debug_file_name_;
|
|
}
|
|
|
|
std::vector<uint8_t> ModuleSnapshotMinidump::BuildID() const {
|
|
INITIALIZATION_STATE_DCHECK_VALID(initialized_);
|
|
return build_id_;
|
|
}
|
|
|
|
std::vector<std::string> ModuleSnapshotMinidump::AnnotationsVector() const {
|
|
INITIALIZATION_STATE_DCHECK_VALID(initialized_);
|
|
return annotations_vector_;
|
|
}
|
|
|
|
std::map<std::string, std::string>
|
|
ModuleSnapshotMinidump::AnnotationsSimpleMap() const {
|
|
INITIALIZATION_STATE_DCHECK_VALID(initialized_);
|
|
return annotations_simple_map_;
|
|
}
|
|
|
|
std::vector<AnnotationSnapshot> ModuleSnapshotMinidump::AnnotationObjects()
|
|
const {
|
|
INITIALIZATION_STATE_DCHECK_VALID(initialized_);
|
|
return annotation_objects_;
|
|
}
|
|
|
|
std::set<CheckedRange<uint64_t>> ModuleSnapshotMinidump::ExtraMemoryRanges()
|
|
const {
|
|
INITIALIZATION_STATE_DCHECK_VALID(initialized_);
|
|
NOTREACHED(); // https://crashpad.chromium.org/bug/10
|
|
return std::set<CheckedRange<uint64_t>>();
|
|
}
|
|
|
|
std::vector<const UserMinidumpStream*>
|
|
ModuleSnapshotMinidump::CustomMinidumpStreams() const {
|
|
INITIALIZATION_STATE_DCHECK_VALID(initialized_);
|
|
NOTREACHED(); // https://crashpad.chromium.org/bug/10
|
|
return std::vector<const UserMinidumpStream*>();
|
|
}
|
|
|
|
bool ModuleSnapshotMinidump::InitializeModuleCrashpadInfo(
|
|
FileReaderInterface* file_reader,
|
|
const MINIDUMP_LOCATION_DESCRIPTOR*
|
|
minidump_module_crashpad_info_location) {
|
|
if (!minidump_module_crashpad_info_location ||
|
|
minidump_module_crashpad_info_location->Rva == 0) {
|
|
return true;
|
|
}
|
|
|
|
MinidumpModuleCrashpadInfo minidump_module_crashpad_info;
|
|
if (minidump_module_crashpad_info_location->DataSize <
|
|
sizeof(minidump_module_crashpad_info)) {
|
|
LOG(ERROR) << "minidump_module_crashpad_info size mismatch";
|
|
return false;
|
|
}
|
|
|
|
if (!file_reader->SeekSet(minidump_module_crashpad_info_location->Rva)) {
|
|
return false;
|
|
}
|
|
|
|
if (!file_reader->ReadExactly(&minidump_module_crashpad_info,
|
|
sizeof(minidump_module_crashpad_info))) {
|
|
return false;
|
|
}
|
|
|
|
if (minidump_module_crashpad_info.version !=
|
|
MinidumpModuleCrashpadInfo::kVersion) {
|
|
LOG(ERROR) << "minidump_module_crashpad_info version mismatch";
|
|
return false;
|
|
}
|
|
|
|
if (!ReadMinidumpStringList(file_reader,
|
|
minidump_module_crashpad_info.list_annotations,
|
|
&annotations_vector_)) {
|
|
return false;
|
|
}
|
|
|
|
if (!ReadMinidumpSimpleStringDictionary(
|
|
file_reader,
|
|
minidump_module_crashpad_info.simple_annotations,
|
|
&annotations_simple_map_)) {
|
|
return false;
|
|
}
|
|
|
|
if (!ReadMinidumpAnnotationList(
|
|
file_reader,
|
|
minidump_module_crashpad_info.annotation_objects,
|
|
&annotation_objects_)) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
} // namespace internal
|
|
} // namespace crashpad
|