//===-- ObjectFileMinidump.cpp --------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "ObjectFileMinidump.h" #include "MinidumpFileBuilder.h" #include "lldb/Core/ModuleSpec.h" #include "lldb/Core/PluginManager.h" #include "lldb/Core/Section.h" #include "lldb/Target/Process.h" #include "llvm/Support/FileSystem.h" using namespace lldb; using namespace lldb_private; LLDB_PLUGIN_DEFINE(ObjectFileMinidump) void ObjectFileMinidump::Initialize() { PluginManager::RegisterPlugin( GetPluginNameStatic(), GetPluginDescriptionStatic(), CreateInstance, CreateMemoryInstance, GetModuleSpecifications, SaveCore); } void ObjectFileMinidump::Terminate() { PluginManager::UnregisterPlugin(CreateInstance); } ObjectFile *ObjectFileMinidump::CreateInstance( const lldb::ModuleSP &module_sp, lldb::DataBufferSP data_sp, lldb::offset_t data_offset, const lldb_private::FileSpec *file, lldb::offset_t offset, lldb::offset_t length) { return nullptr; } ObjectFile *ObjectFileMinidump::CreateMemoryInstance( const lldb::ModuleSP &module_sp, WritableDataBufferSP data_sp, const ProcessSP &process_sp, lldb::addr_t header_addr) { return nullptr; } size_t ObjectFileMinidump::GetModuleSpecifications( const lldb_private::FileSpec &file, lldb::DataBufferSP &data_sp, lldb::offset_t data_offset, lldb::offset_t file_offset, lldb::offset_t length, lldb_private::ModuleSpecList &specs) { specs.Clear(); return 0; } bool ObjectFileMinidump::SaveCore(const lldb::ProcessSP &process_sp, const lldb_private::FileSpec &outfile, lldb::SaveCoreStyle &core_style, lldb_private::Status &error) { // Set default core style if it isn't set. if (core_style == SaveCoreStyle::eSaveCoreUnspecified) core_style = SaveCoreStyle::eSaveCoreStackOnly; if (!process_sp) return false; MinidumpFileBuilder builder; Target &target = process_sp->GetTarget(); error = builder.AddSystemInfo(target.GetArchitecture().GetTriple()); if (error.Fail()) return false; error = builder.AddModuleList(target); if (error.Fail()) return false; builder.AddMiscInfo(process_sp); error = builder.AddThreadList(process_sp); if (error.Fail()) return false; // Add any exceptions but only if there are any in any threads. builder.AddExceptions(process_sp); error = builder.AddMemoryList(process_sp, core_style); if (error.Fail()) return false; if (target.GetArchitecture().GetTriple().getOS() == llvm::Triple::OSType::Linux) { builder.AddLinuxFileStreams(process_sp); } llvm::Expected maybe_core_file = FileSystem::Instance().Open( outfile, File::eOpenOptionWriteOnly | File::eOpenOptionCanCreate); if (!maybe_core_file) { error = maybe_core_file.takeError(); return false; } lldb::FileUP core_file = std::move(maybe_core_file.get()); error = builder.Dump(core_file); if (error.Fail()) return false; return true; }