xref: /freebsd-src/contrib/llvm-project/lldb/source/Plugins/Process/minidump/ProcessMinidump.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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 &region_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