10b57cec5SDimitry Andric //===-- ProcessMinidump.h ---------------------------------------*- C++ -*-===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric 95ffd83dbSDimitry Andric #ifndef LLDB_SOURCE_PLUGINS_PROCESS_MINIDUMP_PROCESSMINIDUMP_H 105ffd83dbSDimitry Andric #define LLDB_SOURCE_PLUGINS_PROCESS_MINIDUMP_PROCESSMINIDUMP_H 110b57cec5SDimitry Andric 120b57cec5SDimitry Andric #include "MinidumpParser.h" 130b57cec5SDimitry Andric #include "MinidumpTypes.h" 140b57cec5SDimitry Andric 15e8d8bef9SDimitry Andric #include "lldb/Target/PostMortemProcess.h" 160b57cec5SDimitry Andric #include "lldb/Target/StopInfo.h" 170b57cec5SDimitry Andric #include "lldb/Target/Target.h" 180b57cec5SDimitry Andric #include "lldb/Utility/ConstString.h" 190b57cec5SDimitry Andric #include "lldb/Utility/Status.h" 200b57cec5SDimitry Andric 210b57cec5SDimitry Andric #include "llvm/Support/Format.h" 220b57cec5SDimitry Andric #include "llvm/Support/raw_ostream.h" 23*bdd1243dSDimitry Andric #include <optional> 240b57cec5SDimitry Andric 250b57cec5SDimitry Andric namespace lldb_private { 260b57cec5SDimitry Andric 270b57cec5SDimitry Andric namespace minidump { 280b57cec5SDimitry Andric 29e8d8bef9SDimitry Andric class ProcessMinidump : public PostMortemProcess { 300b57cec5SDimitry Andric public: 310b57cec5SDimitry Andric static lldb::ProcessSP CreateInstance(lldb::TargetSP target_sp, 320b57cec5SDimitry Andric lldb::ListenerSP listener_sp, 33e8d8bef9SDimitry Andric const FileSpec *crash_file_path, 34e8d8bef9SDimitry Andric bool can_connect); 350b57cec5SDimitry Andric 360b57cec5SDimitry Andric static void Initialize(); 370b57cec5SDimitry Andric 380b57cec5SDimitry Andric static void Terminate(); 390b57cec5SDimitry Andric 40349cc55cSDimitry Andric static llvm::StringRef GetPluginNameStatic() { return "minidump"; } 410b57cec5SDimitry Andric 42349cc55cSDimitry Andric static llvm::StringRef GetPluginDescriptionStatic(); 430b57cec5SDimitry Andric 440b57cec5SDimitry Andric ProcessMinidump(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp, 450b57cec5SDimitry Andric const FileSpec &core_file, lldb::DataBufferSP code_data); 460b57cec5SDimitry Andric 470b57cec5SDimitry Andric ~ProcessMinidump() override; 480b57cec5SDimitry Andric 490b57cec5SDimitry Andric bool CanDebug(lldb::TargetSP target_sp, 500b57cec5SDimitry Andric bool plugin_specified_by_name) override; 510b57cec5SDimitry Andric 520b57cec5SDimitry Andric CommandObject *GetPluginCommandObject() override; 530b57cec5SDimitry Andric 540b57cec5SDimitry Andric Status DoLoadCore() override; 550b57cec5SDimitry Andric 560b57cec5SDimitry Andric DynamicLoader *GetDynamicLoader() override { return nullptr; } 570b57cec5SDimitry Andric 58349cc55cSDimitry Andric llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } 590b57cec5SDimitry Andric 600b57cec5SDimitry Andric SystemRuntime *GetSystemRuntime() override { return nullptr; } 610b57cec5SDimitry Andric 620b57cec5SDimitry Andric Status DoDestroy() override; 630b57cec5SDimitry Andric 640b57cec5SDimitry Andric void RefreshStateAfterStop() override; 650b57cec5SDimitry Andric 660b57cec5SDimitry Andric bool IsAlive() override; 670b57cec5SDimitry Andric 680b57cec5SDimitry Andric bool WarnBeforeDetach() const override; 690b57cec5SDimitry Andric 700b57cec5SDimitry Andric size_t ReadMemory(lldb::addr_t addr, void *buf, size_t size, 710b57cec5SDimitry Andric Status &error) override; 720b57cec5SDimitry Andric 730b57cec5SDimitry Andric size_t DoReadMemory(lldb::addr_t addr, void *buf, size_t size, 740b57cec5SDimitry Andric Status &error) override; 750b57cec5SDimitry Andric 760b57cec5SDimitry Andric ArchSpec GetArchitecture(); 770b57cec5SDimitry Andric 780b57cec5SDimitry Andric Status GetMemoryRegions( 790b57cec5SDimitry Andric lldb_private::MemoryRegionInfos ®ion_list) override; 800b57cec5SDimitry Andric 810b57cec5SDimitry Andric bool GetProcessInfo(ProcessInstanceInfo &info) override; 820b57cec5SDimitry Andric 830b57cec5SDimitry Andric Status WillResume() override { 840b57cec5SDimitry Andric Status error; 85349cc55cSDimitry Andric error.SetErrorStringWithFormatv( 86349cc55cSDimitry Andric "error: {0} does not support resuming processes", GetPluginName()); 870b57cec5SDimitry Andric return error; 880b57cec5SDimitry Andric } 890b57cec5SDimitry Andric 90*bdd1243dSDimitry Andric std::optional<MinidumpParser> m_minidump_parser; 910b57cec5SDimitry Andric 920b57cec5SDimitry Andric protected: 930b57cec5SDimitry Andric void Clear(); 940b57cec5SDimitry Andric 95e8d8bef9SDimitry Andric bool DoUpdateThreadList(ThreadList &old_thread_list, 960b57cec5SDimitry Andric ThreadList &new_thread_list) override; 970b57cec5SDimitry Andric 98d56accc7SDimitry Andric Status DoGetMemoryRegionInfo(lldb::addr_t load_addr, 99d56accc7SDimitry Andric MemoryRegionInfo &range_info) override; 100d56accc7SDimitry Andric 1010b57cec5SDimitry Andric void ReadModuleList(); 1020b57cec5SDimitry Andric 103eaeb601bSDimitry Andric lldb::ModuleSP GetOrCreateModule(lldb_private::UUID minidump_uuid, 104eaeb601bSDimitry Andric llvm::StringRef name, 105eaeb601bSDimitry Andric lldb_private::ModuleSpec module_spec); 106eaeb601bSDimitry Andric 1070b57cec5SDimitry Andric JITLoaderList &GetJITLoaders() override; 1080b57cec5SDimitry Andric 1090b57cec5SDimitry Andric private: 1100b57cec5SDimitry Andric lldb::DataBufferSP m_core_data; 1110b57cec5SDimitry Andric llvm::ArrayRef<minidump::Thread> m_thread_list; 1129dba64beSDimitry Andric const minidump::ExceptionStream *m_active_exception; 1130b57cec5SDimitry Andric lldb::CommandObjectSP m_command_sp; 1140b57cec5SDimitry Andric bool m_is_wow64; 115*bdd1243dSDimitry Andric std::optional<MemoryRegionInfos> m_memory_regions; 116480093f4SDimitry Andric 117480093f4SDimitry Andric void BuildMemoryRegions(); 1180b57cec5SDimitry Andric }; 1190b57cec5SDimitry Andric 1200b57cec5SDimitry Andric } // namespace minidump 1210b57cec5SDimitry Andric } // namespace lldb_private 1220b57cec5SDimitry Andric 1235ffd83dbSDimitry Andric #endif // LLDB_SOURCE_PLUGINS_PROCESS_MINIDUMP_PROCESSMINIDUMP_H 124