1 //===-- ProcessMinidump.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 LLDB_SOURCE_PLUGINS_PROCESS_MINIDUMP_PROCESSMINIDUMP_H 10 #define LLDB_SOURCE_PLUGINS_PROCESS_MINIDUMP_PROCESSMINIDUMP_H 11 12 #include "MinidumpParser.h" 13 #include "MinidumpTypes.h" 14 15 #include "lldb/Target/PostMortemProcess.h" 16 #include "lldb/Target/StopInfo.h" 17 #include "lldb/Target/Target.h" 18 #include "lldb/Utility/ConstString.h" 19 #include "lldb/Utility/Status.h" 20 21 #include "llvm/Support/Format.h" 22 #include "llvm/Support/raw_ostream.h" 23 #include <optional> 24 25 namespace lldb_private { 26 27 namespace minidump { 28 29 class ProcessMinidump : public PostMortemProcess { 30 public: 31 static lldb::ProcessSP CreateInstance(lldb::TargetSP target_sp, 32 lldb::ListenerSP listener_sp, 33 const FileSpec *crash_file_path, 34 bool can_connect); 35 36 static void Initialize(); 37 38 static void Terminate(); 39 40 static llvm::StringRef GetPluginNameStatic() { return "minidump"; } 41 42 static llvm::StringRef GetPluginDescriptionStatic(); 43 44 ProcessMinidump(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp, 45 const FileSpec &core_file, lldb::DataBufferSP code_data); 46 47 ~ProcessMinidump() override; 48 49 bool CanDebug(lldb::TargetSP target_sp, 50 bool plugin_specified_by_name) override; 51 52 CommandObject *GetPluginCommandObject() override; 53 54 Status DoLoadCore() override; 55 56 DynamicLoader *GetDynamicLoader() override { return nullptr; } 57 58 llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } 59 60 SystemRuntime *GetSystemRuntime() override { return nullptr; } 61 62 Status DoDestroy() override; 63 64 void RefreshStateAfterStop() override; 65 66 bool IsAlive() override; 67 68 bool WarnBeforeDetach() const override; 69 70 size_t ReadMemory(lldb::addr_t addr, void *buf, size_t size, 71 Status &error) override; 72 73 size_t DoReadMemory(lldb::addr_t addr, void *buf, size_t size, 74 Status &error) override; 75 76 ArchSpec GetArchitecture(); 77 78 Status GetMemoryRegions( 79 lldb_private::MemoryRegionInfos ®ion_list) override; 80 81 bool GetProcessInfo(ProcessInstanceInfo &info) override; 82 83 Status WillResume() override { 84 Status error; 85 error.SetErrorStringWithFormatv( 86 "error: {0} does not support resuming processes", GetPluginName()); 87 return error; 88 } 89 90 std::optional<MinidumpParser> m_minidump_parser; 91 92 protected: 93 void Clear(); 94 95 bool DoUpdateThreadList(ThreadList &old_thread_list, 96 ThreadList &new_thread_list) override; 97 98 Status DoGetMemoryRegionInfo(lldb::addr_t load_addr, 99 MemoryRegionInfo &range_info) override; 100 101 void ReadModuleList(); 102 103 lldb::ModuleSP GetOrCreateModule(lldb_private::UUID minidump_uuid, 104 llvm::StringRef name, 105 lldb_private::ModuleSpec module_spec); 106 107 JITLoaderList &GetJITLoaders() override; 108 109 private: 110 FileSpec m_core_file; 111 lldb::DataBufferSP m_core_data; 112 llvm::ArrayRef<minidump::Thread> m_thread_list; 113 const minidump::ExceptionStream *m_active_exception; 114 lldb::CommandObjectSP m_command_sp; 115 bool m_is_wow64; 116 std::optional<MemoryRegionInfos> m_memory_regions; 117 118 void BuildMemoryRegions(); 119 }; 120 121 } // namespace minidump 122 } // namespace lldb_private 123 124 #endif // LLDB_SOURCE_PLUGINS_PROCESS_MINIDUMP_PROCESSMINIDUMP_H 125