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::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();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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")
|
||||
|
|
Loading…
Reference in New Issue