[Lldb-commits] [lldb] b07803e - [lldb] [Process/FreeBSD] Support SaveCore() using PT_COREDUMP
Michał Górny via lldb-commits
lldb-commits at lists.llvm.org
Wed Sep 8 02:01:42 PDT 2021
Author: Michał Górny
Date: 2021-09-08T10:58:12+02:00
New Revision: b07803ee2a97fdcf4ed6494d8d6593bf985a5150
URL: https://github.com/llvm/llvm-project/commit/b07803ee2a97fdcf4ed6494d8d6593bf985a5150
DIFF: https://github.com/llvm/llvm-project/commit/b07803ee2a97fdcf4ed6494d8d6593bf985a5150.diff
LOG: [lldb] [Process/FreeBSD] Support SaveCore() using PT_COREDUMP
Differential Revision: https://reviews.llvm.org/D109326
Added:
Modified:
lldb/source/Plugins/Process/FreeBSD/NativeProcessFreeBSD.cpp
lldb/source/Plugins/Process/FreeBSD/NativeProcessFreeBSD.h
lldb/test/API/functionalities/process_save_core/TestProcessSaveCore.py
lldb/test/API/tools/lldb-server/TestGdbRemoteSaveCore.py
Removed:
################################################################################
diff --git a/lldb/source/Plugins/Process/FreeBSD/NativeProcessFreeBSD.cpp b/lldb/source/Plugins/Process/FreeBSD/NativeProcessFreeBSD.cpp
index d6426b3d23675..d795a43375ca7 100644
--- a/lldb/source/Plugins/Process/FreeBSD/NativeProcessFreeBSD.cpp
+++ b/lldb/source/Plugins/Process/FreeBSD/NativeProcessFreeBSD.cpp
@@ -131,7 +131,8 @@ NativeProcessFreeBSD::Factory::Attach(
NativeProcessFreeBSD::Extension
NativeProcessFreeBSD::Factory::GetSupportedExtensions() const {
return Extension::multiprocess | Extension::fork | Extension::vfork |
- Extension::pass_signals | Extension::auxv | Extension::libraries_svr4;
+ Extension::pass_signals | Extension::auxv | Extension::libraries_svr4 |
+ Extension::savecore;
}
// Public Instance Methods
@@ -1009,3 +1010,30 @@ void NativeProcessFreeBSD::MonitorClone(::pid_t child_pid, bool is_vfork,
}
}
}
+
+llvm::Expected<std::string>
+NativeProcessFreeBSD::SaveCore(llvm::StringRef path_hint) {
+ using namespace llvm::sys::fs;
+
+ llvm::SmallString<128> path{path_hint};
+ Status error;
+ struct ptrace_coredump pc = {};
+
+ // Try with the suggested path first. If there is no suggested path or it
+ // failed to open, use a temporary file.
+ if (path.empty() ||
+ openFile(path, pc.pc_fd, CD_CreateNew, FA_Write, OF_None)) {
+ if (std::error_code errc =
+ createTemporaryFile("lldb", "core", pc.pc_fd, path))
+ return llvm::createStringError(errc, "Unable to create a temporary file");
+ }
+ error = PtraceWrapper(PT_COREDUMP, GetID(), &pc, sizeof(pc));
+
+ std::error_code close_err = closeFile(pc.pc_fd);
+ if (error.Fail())
+ return error.ToError();
+ if (close_err)
+ return llvm::createStringError(
+ close_err, "Unable to close the core dump after writing");
+ return path.str().str();
+}
diff --git a/lldb/source/Plugins/Process/FreeBSD/NativeProcessFreeBSD.h b/lldb/source/Plugins/Process/FreeBSD/NativeProcessFreeBSD.h
index 7ec9d17d4cf48..44b8a53699bb6 100644
--- a/lldb/source/Plugins/Process/FreeBSD/NativeProcessFreeBSD.h
+++ b/lldb/source/Plugins/Process/FreeBSD/NativeProcessFreeBSD.h
@@ -91,6 +91,8 @@ class NativeProcessFreeBSD : public NativeProcessELF,
bool SupportHardwareSingleStepping() const;
+ llvm::Expected<std::string> SaveCore(llvm::StringRef path_hint) override;
+
protected:
llvm::Expected<llvm::ArrayRef<uint8_t>>
GetSoftwareBreakpointTrapOpcode(size_t size_hint) override;
diff --git a/lldb/test/API/functionalities/process_save_core/TestProcessSaveCore.py b/lldb/test/API/functionalities/process_save_core/TestProcessSaveCore.py
index 9897fb6b4910c..42955975a71b8 100644
--- a/lldb/test/API/functionalities/process_save_core/TestProcessSaveCore.py
+++ b/lldb/test/API/functionalities/process_save_core/TestProcessSaveCore.py
@@ -64,7 +64,7 @@ def test_save_windows_mini_dump(self):
if (os.path.isfile(core)):
os.unlink(core)
- @skipUnlessPlatform(["netbsd"])
+ @skipUnlessPlatform(["freebsd", "netbsd"])
def test_save_core_via_process_plugin(self):
self.build()
exe = self.getBuildArtifact("a.out")
diff --git a/lldb/test/API/tools/lldb-server/TestGdbRemoteSaveCore.py b/lldb/test/API/tools/lldb-server/TestGdbRemoteSaveCore.py
index 405a73bcdba8d..10ba1e91134f4 100644
--- a/lldb/test/API/tools/lldb-server/TestGdbRemoteSaveCore.py
+++ b/lldb/test/API/tools/lldb-server/TestGdbRemoteSaveCore.py
@@ -38,15 +38,15 @@ def coredump_test(self, core_path=None, expect_path=None):
self.assertTrue(process, PROCESS_IS_VALID)
self.assertEqual(process.GetProcessID(), procs["inferior"].pid)
- @skipUnlessPlatform(oslist=["netbsd"])
+ @skipUnlessPlatform(oslist=["freebsd", "netbsd"])
def test_netbsd_path(self):
core = lldbutil.append_to_process_working_directory(self, "core")
self.coredump_test(core, core)
- @skipUnlessPlatform(oslist=["netbsd"])
+ @skipUnlessPlatform(oslist=["freebsd", "netbsd"])
def test_netbsd_no_path(self):
self.coredump_test()
- @skipUnlessPlatform(oslist=["netbsd"])
+ @skipUnlessPlatform(oslist=["freebsd", "netbsd"])
def test_netbsd_bad_path(self):
self.coredump_test("/dev/null/cantwritehere")
More information about the lldb-commits
mailing list