xref: /llvm-project/lldb/test/API/functionalities/process_save_core/TestProcessSaveCore.py (revision 86f7374078288e2b3d3d0fd66428f7752e2319e6)
1"""
2Test saving a core file (or mini dump).
3"""
4
5import os
6import lldb
7from lldbsuite.test.decorators import *
8from lldbsuite.test.lldbtest import *
9from lldbsuite.test import lldbutil
10
11
12class ProcessSaveCoreTestCase(TestBase):
13    @skipIfRemote
14    @skipUnlessWindows
15    def test_cannot_save_core_unless_process_stopped(self):
16        """Test that SaveCore fails if the process isn't stopped."""
17        self.build()
18        exe = self.getBuildArtifact("a.out")
19        core = self.getBuildArtifact("core.dmp")
20        target = self.dbg.CreateTarget(exe)
21        process = target.LaunchSimple(None, None, self.get_process_working_directory())
22        self.assertNotEqual(process.GetState(), lldb.eStateStopped)
23        options = lldb.SBSaveCoreOptions()
24        options.SetOutputFile(lldb.SBFileSpec(core))
25        error = process.SaveCore(core)
26        self.assertTrue(error.Fail())
27
28    @skipIfRemote
29    @skipUnlessWindows
30    def test_save_windows_mini_dump(self):
31        """Test that we can save a Windows mini dump."""
32        self.build()
33        exe = self.getBuildArtifact("a.out")
34        core = self.getBuildArtifact("core.dmp")
35        try:
36            target = self.dbg.CreateTarget(exe)
37            breakpoint = target.BreakpointCreateByName("bar")
38            process = target.LaunchSimple(
39                None, None, self.get_process_working_directory()
40            )
41            self.assertState(process.GetState(), lldb.eStateStopped)
42            self.assertTrue(process.SaveCore(core))
43            self.assertTrue(os.path.isfile(core))
44            self.assertSuccess(process.Kill())
45
46            # To verify, we'll launch with the mini dump, and ensure that we see
47            # the executable in the module list.
48            target = self.dbg.CreateTarget(None)
49            process = target.LoadCore(core)
50            files = [
51                target.GetModuleAtIndex(i).GetFileSpec()
52                for i in range(0, target.GetNumModules())
53            ]
54            paths = [os.path.join(f.GetDirectory(), f.GetFilename()) for f in files]
55            self.assertIn(exe, paths)
56
57        finally:
58            # Clean up the mini dump file.
59            self.assertTrue(self.dbg.DeleteTarget(target))
60            if os.path.isfile(core):
61                os.unlink(core)
62
63    @skipUnlessPlatform(["freebsd", "netbsd"])
64    def test_save_core_via_process_plugin(self):
65        self.build()
66        exe = self.getBuildArtifact("a.out")
67        core = self.getBuildArtifact("a.out.core")
68        try:
69            target = self.dbg.CreateTarget(exe)
70            breakpoint = target.BreakpointCreateByName("bar")
71            process = target.LaunchSimple(
72                None, None, self.get_process_working_directory()
73            )
74            self.assertState(process.GetState(), lldb.eStateStopped)
75            self.assertTrue(process.SaveCore(core))
76            self.assertTrue(os.path.isfile(core))
77            self.assertSuccess(process.Kill())
78            pid = process.GetProcessID()
79
80            target = self.dbg.CreateTarget(None)
81            process = target.LoadCore(core)
82            self.assertTrue(process, PROCESS_IS_VALID)
83            self.assertEqual(process.GetProcessID(), pid)
84
85        finally:
86            self.assertTrue(self.dbg.DeleteTarget(target))
87            try:
88                os.unlink(core)
89            except OSError:
90                pass
91