1 //===-- MinidumpTypes.h -----------------------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef liblldb_MinidumpTypes_h_ 10 #define liblldb_MinidumpTypes_h_ 11 12 13 #include "lldb/Utility/Status.h" 14 15 #include "llvm/ADT/ArrayRef.h" 16 #include "llvm/ADT/BitmaskEnum.h" 17 #include "llvm/ADT/Optional.h" 18 #include "llvm/ADT/SmallVector.h" 19 #include "llvm/ADT/StringRef.h" 20 #include "llvm/BinaryFormat/Minidump.h" 21 #include "llvm/Support/ConvertUTF.h" 22 #include "llvm/Support/Endian.h" 23 24 // C includes 25 // C++ includes 26 27 // Reference: 28 // https://msdn.microsoft.com/en-us/library/windows/desktop/ms679293(v=vs.85).aspx 29 // https://chromium.googlesource.com/breakpad/breakpad/ 30 31 namespace lldb_private { 32 33 namespace minidump { 34 35 using namespace llvm::minidump; 36 37 LLVM_ENABLE_BITMASK_ENUMS_IN_NAMESPACE(); 38 39 enum class CvSignature : uint32_t { 40 Pdb70 = 0x53445352, // RSDS 41 ElfBuildId = 0x4270454c, // BpEL (Breakpad/Crashpad minidumps) 42 }; 43 44 // Reference: 45 // https://crashpad.chromium.org/doxygen/structcrashpad_1_1CodeViewRecordPDB70.html 46 struct CvRecordPdb70 { 47 struct { 48 llvm::support::ulittle32_t Data1; 49 llvm::support::ulittle16_t Data2; 50 llvm::support::ulittle16_t Data3; 51 uint8_t Data4[8]; 52 } Uuid; 53 llvm::support::ulittle32_t Age; 54 // char PDBFileName[]; 55 }; 56 static_assert(sizeof(CvRecordPdb70) == 20, 57 "sizeof CvRecordPdb70 is not correct!"); 58 59 enum class MinidumpMiscInfoFlags : uint32_t { 60 ProcessID = (1 << 0), 61 ProcessTimes = (1 << 1), 62 LLVM_MARK_AS_BITMASK_ENUM(/* LargestValue = */ ProcessTimes) 63 }; 64 65 template <typename T> 66 Status consumeObject(llvm::ArrayRef<uint8_t> &Buffer, const T *&Object) { 67 Status error; 68 if (Buffer.size() < sizeof(T)) { 69 error.SetErrorString("Insufficient buffer!"); 70 return error; 71 } 72 73 Object = reinterpret_cast<const T *>(Buffer.data()); 74 Buffer = Buffer.drop_front(sizeof(T)); 75 return error; 76 } 77 78 struct MinidumpMemoryDescriptor64 { 79 llvm::support::ulittle64_t start_of_memory_range; 80 llvm::support::ulittle64_t data_size; 81 82 static std::pair<llvm::ArrayRef<MinidumpMemoryDescriptor64>, uint64_t> 83 ParseMemory64List(llvm::ArrayRef<uint8_t> &data); 84 }; 85 static_assert(sizeof(MinidumpMemoryDescriptor64) == 16, 86 "sizeof MinidumpMemoryDescriptor64 is not correct!"); 87 88 // TODO misc2, misc3 ? 89 // Reference: 90 // https://msdn.microsoft.com/en-us/library/windows/desktop/ms680389(v=vs.85).aspx 91 struct MinidumpMiscInfo { 92 llvm::support::ulittle32_t size; 93 // flags1 represents what info in the struct is valid 94 llvm::support::ulittle32_t flags1; 95 llvm::support::ulittle32_t process_id; 96 llvm::support::ulittle32_t process_create_time; 97 llvm::support::ulittle32_t process_user_time; 98 llvm::support::ulittle32_t process_kernel_time; 99 100 static const MinidumpMiscInfo *Parse(llvm::ArrayRef<uint8_t> &data); 101 102 llvm::Optional<lldb::pid_t> GetPid() const; 103 }; 104 static_assert(sizeof(MinidumpMiscInfo) == 24, 105 "sizeof MinidumpMiscInfo is not correct!"); 106 107 // The /proc/pid/status is saved as an ascii string in the file 108 class LinuxProcStatus { 109 public: 110 llvm::StringRef proc_status; 111 lldb::pid_t pid; 112 113 static llvm::Optional<LinuxProcStatus> Parse(llvm::ArrayRef<uint8_t> &data); 114 115 lldb::pid_t GetPid() const; 116 117 private: 118 LinuxProcStatus() = default; 119 }; 120 121 } // namespace minidump 122 } // namespace lldb_private 123 #endif // liblldb_MinidumpTypes_h_ 124