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