forked from OSchip/llvm-project
[lldb] [Process/FreeBSD] Support SaveCore() using PT_COREDUMP
Differential Revision: https://reviews.llvm.org/D109326
This commit is contained in:
parent
a42bc456c1
commit
b07803ee2a
|
@ -131,7 +131,8 @@ NativeProcessFreeBSD::Factory::Attach(
|
||||||
NativeProcessFreeBSD::Extension
|
NativeProcessFreeBSD::Extension
|
||||||
NativeProcessFreeBSD::Factory::GetSupportedExtensions() const {
|
NativeProcessFreeBSD::Factory::GetSupportedExtensions() const {
|
||||||
return Extension::multiprocess | Extension::fork | Extension::vfork |
|
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
|
// 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();
|
||||||
|
}
|
||||||
|
|
|
@ -91,6 +91,8 @@ public:
|
||||||
|
|
||||||
bool SupportHardwareSingleStepping() const;
|
bool SupportHardwareSingleStepping() const;
|
||||||
|
|
||||||
|
llvm::Expected<std::string> SaveCore(llvm::StringRef path_hint) override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
llvm::Expected<llvm::ArrayRef<uint8_t>>
|
llvm::Expected<llvm::ArrayRef<uint8_t>>
|
||||||
GetSoftwareBreakpointTrapOpcode(size_t size_hint) override;
|
GetSoftwareBreakpointTrapOpcode(size_t size_hint) override;
|
||||||
|
|
|
@ -64,7 +64,7 @@ class ProcessSaveCoreTestCase(TestBase):
|
||||||
if (os.path.isfile(core)):
|
if (os.path.isfile(core)):
|
||||||
os.unlink(core)
|
os.unlink(core)
|
||||||
|
|
||||||
@skipUnlessPlatform(["netbsd"])
|
@skipUnlessPlatform(["freebsd", "netbsd"])
|
||||||
def test_save_core_via_process_plugin(self):
|
def test_save_core_via_process_plugin(self):
|
||||||
self.build()
|
self.build()
|
||||||
exe = self.getBuildArtifact("a.out")
|
exe = self.getBuildArtifact("a.out")
|
||||||
|
|
|
@ -38,15 +38,15 @@ class TestGdbSaveCore(gdbremote_testcase.GdbRemoteTestCaseBase):
|
||||||
self.assertTrue(process, PROCESS_IS_VALID)
|
self.assertTrue(process, PROCESS_IS_VALID)
|
||||||
self.assertEqual(process.GetProcessID(), procs["inferior"].pid)
|
self.assertEqual(process.GetProcessID(), procs["inferior"].pid)
|
||||||
|
|
||||||
@skipUnlessPlatform(oslist=["netbsd"])
|
@skipUnlessPlatform(oslist=["freebsd", "netbsd"])
|
||||||
def test_netbsd_path(self):
|
def test_netbsd_path(self):
|
||||||
core = lldbutil.append_to_process_working_directory(self, "core")
|
core = lldbutil.append_to_process_working_directory(self, "core")
|
||||||
self.coredump_test(core, core)
|
self.coredump_test(core, core)
|
||||||
|
|
||||||
@skipUnlessPlatform(oslist=["netbsd"])
|
@skipUnlessPlatform(oslist=["freebsd", "netbsd"])
|
||||||
def test_netbsd_no_path(self):
|
def test_netbsd_no_path(self):
|
||||||
self.coredump_test()
|
self.coredump_test()
|
||||||
|
|
||||||
@skipUnlessPlatform(oslist=["netbsd"])
|
@skipUnlessPlatform(oslist=["freebsd", "netbsd"])
|
||||||
def test_netbsd_bad_path(self):
|
def test_netbsd_bad_path(self):
|
||||||
self.coredump_test("/dev/null/cantwritehere")
|
self.coredump_test("/dev/null/cantwritehere")
|
||||||
|
|
Loading…
Reference in New Issue