1eee687a6SAndrej Korman //===-- ObjectFileMinidump.cpp --------------------------------------------===// 2eee687a6SAndrej Korman // 3eee687a6SAndrej Korman // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4eee687a6SAndrej Korman // See https://llvm.org/LICENSE.txt for license information. 5eee687a6SAndrej Korman // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6eee687a6SAndrej Korman // 7eee687a6SAndrej Korman //===----------------------------------------------------------------------===// 8eee687a6SAndrej Korman 9eee687a6SAndrej Korman #include "ObjectFileMinidump.h" 10eee687a6SAndrej Korman 11eee687a6SAndrej Korman #include "MinidumpFileBuilder.h" 12eee687a6SAndrej Korman 13eee687a6SAndrej Korman #include "lldb/Core/ModuleSpec.h" 14eee687a6SAndrej Korman #include "lldb/Core/PluginManager.h" 15eee687a6SAndrej Korman #include "lldb/Core/Section.h" 16eee687a6SAndrej Korman #include "lldb/Target/Process.h" 17eee687a6SAndrej Korman 18eee687a6SAndrej Korman #include "llvm/Support/FileSystem.h" 19eee687a6SAndrej Korman 20eee687a6SAndrej Korman using namespace lldb; 21eee687a6SAndrej Korman using namespace lldb_private; 22eee687a6SAndrej Korman 23eee687a6SAndrej Korman LLDB_PLUGIN_DEFINE(ObjectFileMinidump) 24eee687a6SAndrej Korman 25eee687a6SAndrej Korman void ObjectFileMinidump::Initialize() { 26eee687a6SAndrej Korman PluginManager::RegisterPlugin( 27eee687a6SAndrej Korman GetPluginNameStatic(), GetPluginDescriptionStatic(), CreateInstance, 28eee687a6SAndrej Korman CreateMemoryInstance, GetModuleSpecifications, SaveCore); 29eee687a6SAndrej Korman } 30eee687a6SAndrej Korman 31eee687a6SAndrej Korman void ObjectFileMinidump::Terminate() { 32eee687a6SAndrej Korman PluginManager::UnregisterPlugin(CreateInstance); 33eee687a6SAndrej Korman } 34eee687a6SAndrej Korman 35eee687a6SAndrej Korman ObjectFile *ObjectFileMinidump::CreateInstance( 36*c69307e5SJonas Devlieghere const lldb::ModuleSP &module_sp, lldb::DataBufferSP data_sp, 37eee687a6SAndrej Korman lldb::offset_t data_offset, const lldb_private::FileSpec *file, 38eee687a6SAndrej Korman lldb::offset_t offset, lldb::offset_t length) { 39eee687a6SAndrej Korman return nullptr; 40eee687a6SAndrej Korman } 41eee687a6SAndrej Korman 42eee687a6SAndrej Korman ObjectFile *ObjectFileMinidump::CreateMemoryInstance( 43*c69307e5SJonas Devlieghere const lldb::ModuleSP &module_sp, DataBufferSP data_sp, 44eee687a6SAndrej Korman const ProcessSP &process_sp, lldb::addr_t header_addr) { 45eee687a6SAndrej Korman return nullptr; 46eee687a6SAndrej Korman } 47eee687a6SAndrej Korman 48eee687a6SAndrej Korman size_t ObjectFileMinidump::GetModuleSpecifications( 49eee687a6SAndrej Korman const lldb_private::FileSpec &file, lldb::DataBufferSP &data_sp, 50eee687a6SAndrej Korman lldb::offset_t data_offset, lldb::offset_t file_offset, 51eee687a6SAndrej Korman lldb::offset_t length, lldb_private::ModuleSpecList &specs) { 52eee687a6SAndrej Korman specs.Clear(); 53eee687a6SAndrej Korman return 0; 54eee687a6SAndrej Korman } 55eee687a6SAndrej Korman 56eee687a6SAndrej Korman bool ObjectFileMinidump::SaveCore(const lldb::ProcessSP &process_sp, 57eee687a6SAndrej Korman const lldb_private::FileSpec &outfile, 58eee687a6SAndrej Korman lldb::SaveCoreStyle &core_style, 59eee687a6SAndrej Korman lldb_private::Status &error) { 60eee687a6SAndrej Korman if (core_style != SaveCoreStyle::eSaveCoreStackOnly) { 61eee687a6SAndrej Korman error.SetErrorString("Only stack minidumps supported yet."); 62eee687a6SAndrej Korman return false; 63eee687a6SAndrej Korman } 64eee687a6SAndrej Korman 65eee687a6SAndrej Korman if (!process_sp) 66eee687a6SAndrej Korman return false; 67eee687a6SAndrej Korman 68eee687a6SAndrej Korman MinidumpFileBuilder builder; 69eee687a6SAndrej Korman 70eee687a6SAndrej Korman Target &target = process_sp->GetTarget(); 71eee687a6SAndrej Korman 72eee687a6SAndrej Korman error = builder.AddSystemInfo(target.GetArchitecture().GetTriple()); 73eee687a6SAndrej Korman if (error.Fail()) 74eee687a6SAndrej Korman return false; 75eee687a6SAndrej Korman 76eee687a6SAndrej Korman error = builder.AddModuleList(target); 77eee687a6SAndrej Korman if (error.Fail()) 78eee687a6SAndrej Korman return false; 79eee687a6SAndrej Korman 80eee687a6SAndrej Korman builder.AddMiscInfo(process_sp); 81eee687a6SAndrej Korman 82eee687a6SAndrej Korman if (target.GetArchitecture().GetMachine() == llvm::Triple::ArchType::x86_64) { 83eee687a6SAndrej Korman error = builder.AddThreadList(process_sp); 84eee687a6SAndrej Korman if (error.Fail()) 85eee687a6SAndrej Korman return false; 86eee687a6SAndrej Korman 87eee687a6SAndrej Korman error = builder.AddException(process_sp); 88eee687a6SAndrej Korman if (error.Fail()) 89eee687a6SAndrej Korman return false; 90eee687a6SAndrej Korman 91eee687a6SAndrej Korman error = builder.AddMemoryList(process_sp); 92eee687a6SAndrej Korman if (error.Fail()) 93eee687a6SAndrej Korman return false; 94eee687a6SAndrej Korman } 95eee687a6SAndrej Korman 96eee687a6SAndrej Korman if (target.GetArchitecture().GetTriple().getOS() == 97eee687a6SAndrej Korman llvm::Triple::OSType::Linux) { 98eee687a6SAndrej Korman builder.AddLinuxFileStreams(process_sp); 99eee687a6SAndrej Korman } 100eee687a6SAndrej Korman 101eee687a6SAndrej Korman llvm::Expected<lldb::FileUP> maybe_core_file = FileSystem::Instance().Open( 102eee687a6SAndrej Korman outfile, File::eOpenOptionWriteOnly | File::eOpenOptionCanCreate); 103eee687a6SAndrej Korman if (!maybe_core_file) { 104eee687a6SAndrej Korman error = maybe_core_file.takeError(); 105eee687a6SAndrej Korman return false; 106eee687a6SAndrej Korman } 107eee687a6SAndrej Korman lldb::FileUP core_file = std::move(maybe_core_file.get()); 108eee687a6SAndrej Korman 109eee687a6SAndrej Korman error = builder.Dump(core_file); 110eee687a6SAndrej Korman if (error.Fail()) 111eee687a6SAndrej Korman return false; 112eee687a6SAndrej Korman 113eee687a6SAndrej Korman return true; 114eee687a6SAndrej Korman } 115