[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