aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/lldb/source/Plugins/ObjectFile/Minidump/ObjectFileMinidump.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm-project/lldb/source/Plugins/ObjectFile/Minidump/ObjectFileMinidump.cpp')
-rw-r--r--contrib/llvm-project/lldb/source/Plugins/ObjectFile/Minidump/ObjectFileMinidump.cpp87
1 files changed, 57 insertions, 30 deletions
diff --git a/contrib/llvm-project/lldb/source/Plugins/ObjectFile/Minidump/ObjectFileMinidump.cpp b/contrib/llvm-project/lldb/source/Plugins/ObjectFile/Minidump/ObjectFileMinidump.cpp
index fe609c7f3d20..faa144bfb5f6 100644
--- a/contrib/llvm-project/lldb/source/Plugins/ObjectFile/Minidump/ObjectFileMinidump.cpp
+++ b/contrib/llvm-project/lldb/source/Plugins/ObjectFile/Minidump/ObjectFileMinidump.cpp
@@ -14,6 +14,8 @@
#include "lldb/Core/PluginManager.h"
#include "lldb/Core/Section.h"
#include "lldb/Target/Process.h"
+#include "lldb/Utility/LLDBLog.h"
+#include "lldb/Utility/Log.h"
#include "llvm/Support/FileSystem.h"
@@ -54,57 +56,82 @@ size_t ObjectFileMinidump::GetModuleSpecifications(
}
bool ObjectFileMinidump::SaveCore(const lldb::ProcessSP &process_sp,
- const lldb_private::FileSpec &outfile,
- lldb::SaveCoreStyle &core_style,
+ const lldb_private::SaveCoreOptions &options,
lldb_private::Status &error) {
- // Set default core style if it isn't set.
+ // Output file and process_sp are both checked in PluginManager::SaveCore.
+ assert(options.GetOutputFile().has_value());
+ assert(process_sp);
+
+ // Minidump defaults to stacks only.
+ SaveCoreStyle core_style = options.GetStyle();
if (core_style == SaveCoreStyle::eSaveCoreUnspecified)
core_style = SaveCoreStyle::eSaveCoreStackOnly;
- if (!process_sp)
+ llvm::Expected<lldb::FileUP> maybe_core_file = FileSystem::Instance().Open(
+ options.GetOutputFile().value(),
+ File::eOpenOptionWriteOnly | File::eOpenOptionCanCreate);
+ if (!maybe_core_file) {
+ error = maybe_core_file.takeError();
return false;
+ }
+ MinidumpFileBuilder builder(std::move(maybe_core_file.get()), process_sp);
- MinidumpFileBuilder builder;
-
- Target &target = process_sp->GetTarget();
-
- error = builder.AddSystemInfo(target.GetArchitecture().GetTriple());
- if (error.Fail())
+ Log *log = GetLog(LLDBLog::Object);
+ error = builder.AddHeaderAndCalculateDirectories();
+ if (error.Fail()) {
+ LLDB_LOGF(log, "AddHeaderAndCalculateDirectories failed: %s",
+ error.AsCString());
+ return false;
+ };
+ error = builder.AddSystemInfo();
+ if (error.Fail()) {
+ LLDB_LOGF(log, "AddSystemInfo failed: %s", error.AsCString());
return false;
+ }
- error = builder.AddModuleList(target);
- if (error.Fail())
+ error = builder.AddModuleList();
+ if (error.Fail()) {
+ LLDB_LOGF(log, "AddModuleList failed: %s", error.AsCString());
+ return false;
+ }
+ error = builder.AddMiscInfo();
+ if (error.Fail()) {
+ LLDB_LOGF(log, "AddMiscInfo failed: %s", error.AsCString());
return false;
+ }
- builder.AddMiscInfo(process_sp);
+ error = builder.AddThreadList();
+ if (error.Fail()) {
+ LLDB_LOGF(log, "AddThreadList failed: %s", error.AsCString());
+ return false;
+ }
- error = builder.AddThreadList(process_sp);
- if (error.Fail())
+ error = builder.AddLinuxFileStreams();
+ if (error.Fail()) {
+ LLDB_LOGF(log, "AddLinuxFileStreams failed: %s", error.AsCString());
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())
+ error = builder.AddExceptions();
+ if (error.Fail()) {
+ LLDB_LOGF(log, "AddExceptions failed: %s", error.AsCString());
return false;
-
- if (target.GetArchitecture().GetTriple().getOS() ==
- llvm::Triple::OSType::Linux) {
- builder.AddLinuxFileStreams(process_sp);
}
- llvm::Expected<lldb::FileUP> maybe_core_file = FileSystem::Instance().Open(
- outfile, File::eOpenOptionWriteOnly | File::eOpenOptionCanCreate);
- if (!maybe_core_file) {
- error = maybe_core_file.takeError();
+ // Note: add memory HAS to be the last thing we do. It can overflow into 64b
+ // land and many RVA's only support 32b
+ error = builder.AddMemoryList(core_style);
+ if (error.Fail()) {
+ LLDB_LOGF(log, "AddMemoryList failed: %s", error.AsCString());
return false;
}
- lldb::FileUP core_file = std::move(maybe_core_file.get());
- error = builder.Dump(core_file);
- if (error.Fail())
+ error = builder.DumpFile();
+ if (error.Fail()) {
+ LLDB_LOGF(log, "DumpFile failed: %s", error.AsCString());
return false;
+ }
return true;
}