[lldb] [Process/FreeBSD] Support SaveCore() using PT_COREDUMP

Differential Revision: https://reviews.llvm.org/D109326
This commit is contained in:
Michał Górny 2021-05-04 21:11:20 +02:00
parent a42bc456c1
commit b07803ee2a
4 changed files with 35 additions and 5 deletions

View file

@ -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();
}

View file

@ -91,6 +91,8 @@ public:
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;

View file

@ -64,7 +64,7 @@ class ProcessSaveCoreTestCase(TestBase):
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")

View file

@ -38,15 +38,15 @@ class TestGdbSaveCore(gdbremote_testcase.GdbRemoteTestCaseBase):
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")