LLDB mainline
ObjectFileMinidump.cpp
Go to the documentation of this file.
1//===-- ObjectFileMinidump.cpp --------------------------------------------===//
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
10
11#include "MinidumpFileBuilder.h"
12
15#include "lldb/Core/Section.h"
16#include "lldb/Target/Process.h"
18#include "lldb/Utility/Log.h"
19
20#include "llvm/Support/FileSystem.h"
21
22using namespace lldb;
23using namespace lldb_private;
24
26
32
36
38 const lldb::ModuleSP &module_sp, lldb::DataExtractorSP extractor_sp,
39 lldb::offset_t data_offset, const lldb_private::FileSpec *file,
40 lldb::offset_t offset, lldb::offset_t length) {
41 return nullptr;
42}
43
45 const lldb::ModuleSP &module_sp, WritableDataBufferSP data_sp,
46 const ProcessSP &process_sp, lldb::addr_t header_addr) {
47 return nullptr;
48}
49
55
58
60 if (!m_success)
61 m_builder.DeleteFile();
62 }
63
64 void SetSuccess() { m_success = true; }
65
66private:
68 bool m_success = false;
69};
70
74 // Output file and process_sp are both checked in PluginManager::SaveCore.
75 assert(options.GetOutputFile().has_value());
76 assert(process_sp);
77
78 // Minidump defaults to stacks only.
81
82 llvm::Expected<lldb::FileUP> maybe_core_file = FileSystem::Instance().Open(
83 options.GetOutputFile().value(),
85 if (!maybe_core_file) {
86 error = Status::FromError(maybe_core_file.takeError());
87 return false;
88 }
89 MinidumpFileBuilder builder(std::move(maybe_core_file.get()), process_sp,
90 options);
91 DumpFailRemoveHolder request(builder);
92
95 if (error.Fail()) {
96 LLDB_LOGF(log, "AddHeaderAndCalculateDirectories failed: %s",
97 error.AsCString());
98 return false;
99 };
100 error = builder.AddSystemInfo();
101 if (error.Fail()) {
102 LLDB_LOGF(log, "AddSystemInfo failed: %s", error.AsCString());
103 return false;
104 }
105
106 error = builder.AddModuleList();
107 if (error.Fail()) {
108 LLDB_LOGF(log, "AddModuleList failed: %s", error.AsCString());
109 return false;
110 }
111 error = builder.AddMiscInfo();
112 if (error.Fail()) {
113 LLDB_LOGF(log, "AddMiscInfo failed: %s", error.AsCString());
114 return false;
115 }
116
117 error = builder.AddThreadList();
118 if (error.Fail()) {
119 LLDB_LOGF(log, "AddThreadList failed: %s", error.AsCString());
120 return false;
121 }
122
123 error = builder.AddLinuxFileStreams();
124 if (error.Fail()) {
125 LLDB_LOGF(log, "AddLinuxFileStreams failed: %s", error.AsCString());
126 return false;
127 }
128
129 // Add any exceptions but only if there are any in any threads.
130 error = builder.AddExceptions();
131 if (error.Fail()) {
132 LLDB_LOGF(log, "AddExceptions failed: %s", error.AsCString());
133 return false;
134 }
135
136 // Note: add memory HAS to be the last thing we do. It can overflow into 64b
137 // land and many RVA's only support 32b
138 error = builder.AddMemoryList();
139 if (error.Fail()) {
140 LLDB_LOGF(log, "AddMemoryList failed: %s", error.AsCString());
141 return false;
142 }
143
144 error = builder.DumpFile();
145 if (error.Fail()) {
146 LLDB_LOGF(log, "DumpFile failed: %s", error.AsCString());
147 return false;
148 }
149
150 request.SetSuccess();
151
152 return true;
153}
static llvm::raw_ostream & error(Stream &strm)
#define LLDB_LOGF(log,...)
Definition Log.h:383
Structure holding data neccessary for minidump file creation.
Placeholder plugin for the save core functionality.
#define LLDB_PLUGIN_DEFINE(PluginName)
Minidump writer for Linux.
lldb_private::Status AddExceptions()
lldb_private::Status AddThreadList()
lldb_private::Status AddHeaderAndCalculateDirectories()
lldb_private::Status AddSystemInfo()
lldb_private::Status AddMemoryList()
lldb_private::Status DumpFile()
lldb_private::Status AddLinuxFileStreams()
lldb_private::Status AddModuleList()
lldb_private::Status AddMiscInfo()
static const char * GetPluginDescriptionStatic()
static lldb_private::ObjectFile * CreateInstance(const lldb::ModuleSP &module_sp, lldb::DataExtractorSP extractor_sp, lldb::offset_t data_offset, const lldb_private::FileSpec *file, lldb::offset_t offset, lldb::offset_t length)
static lldb_private::ModuleSpecList GetModuleSpecifications(const lldb_private::FileSpec &file, lldb::DataExtractorSP &extractor_sp, lldb::offset_t file_offset, lldb::offset_t length)
static lldb_private::ObjectFile * CreateMemoryInstance(const lldb::ModuleSP &module_sp, lldb::WritableDataBufferSP data_sp, const lldb::ProcessSP &process_sp, lldb::addr_t header_addr)
ObjectFileMinidump()=default
static llvm::StringRef GetPluginNameStatic()
static bool SaveCore(const lldb::ProcessSP &process_sp, lldb_private::SaveCoreOptions &options, lldb_private::Status &error)
A file utility class.
Definition FileSpec.h:57
int Open(const char *path, int flags, int mode=0600)
Wraps open in a platform-independent way.
static FileSystem & Instance()
@ eOpenOptionWriteOnly
Definition File.h:52
@ eOpenOptionCanCreate
Definition File.h:56
A plug-in interface definition class for object file parsers.
Definition ObjectFile.h:46
static bool RegisterPlugin(llvm::StringRef name, llvm::StringRef description, ABICreateInstance create_callback)
static bool UnregisterPlugin(ABICreateInstance create_callback)
const std::optional< lldb_private::FileSpec > GetOutputFile() const
lldb::SaveCoreStyle GetStyle() const
void SetStyle(lldb::SaveCoreStyle style)
An error handling class.
Definition Status.h:118
static Status FromError(llvm::Error error)
Avoid using this in new code. Migrate APIs to llvm::Expected instead.
Definition Status.cpp:136
A class that represents a running process on the host machine.
Log * GetLog(Cat mask)
Retrieve the Log object for the channel associated with the given log enum.
Definition Log.h:332
uint64_t offset_t
Definition lldb-types.h:85
std::shared_ptr< lldb_private::Process > ProcessSP
std::shared_ptr< lldb_private::WritableDataBuffer > WritableDataBufferSP
uint64_t addr_t
Definition lldb-types.h:80
std::shared_ptr< lldb_private::DataExtractor > DataExtractorSP
std::shared_ptr< lldb_private::Module > ModuleSP
DumpFailRemoveHolder(MinidumpFileBuilder &builder)
MinidumpFileBuilder & m_builder