xref: /llvm-project/lldb/test/API/functionalities/process_crash_info/TestProcessCrashInfo.py (revision 2238dcc39358353cac21df75c3c3286ab20b8f53)
1d7c403e6SMed Ismail Bennani"""
2d7c403e6SMed Ismail BennaniTest lldb process crash info.
3d7c403e6SMed Ismail Bennani"""
4d7c403e6SMed Ismail Bennani
5d7c403e6SMed Ismail Bennaniimport os
6d7c403e6SMed Ismail Bennani
7d7c403e6SMed Ismail Bennaniimport lldb
8d7c403e6SMed Ismail Bennanifrom lldbsuite.test.decorators import *
9d7c403e6SMed Ismail Bennanifrom lldbsuite.test.lldbtest import *
10d7c403e6SMed Ismail Bennanifrom lldbsuite.test import lldbutil
11eefda182SMed Ismail Bennanifrom lldbsuite.test import lldbtest
12eefda182SMed Ismail Bennani
13d7c403e6SMed Ismail Bennani
14d7c403e6SMed Ismail Bennaniclass PlatformProcessCrashInfoTestCase(TestBase):
15d7c403e6SMed Ismail Bennani    def setUp(self):
16d7c403e6SMed Ismail Bennani        TestBase.setUp(self)
17d7c403e6SMed Ismail Bennani        self.runCmd("settings set auto-confirm true")
18d7c403e6SMed Ismail Bennani        self.source = "main.c"
19*2238dcc3SJonas Devlieghere        self.line = line_number(self.source, "// break here")
20d7c403e6SMed Ismail Bennani
21d7c403e6SMed Ismail Bennani    def tearDown(self):
22d7c403e6SMed Ismail Bennani        self.runCmd("settings clear auto-confirm")
23d7c403e6SMed Ismail Bennani        TestBase.tearDown(self)
24d7c403e6SMed Ismail Bennani
257822c8c0SVedant Kumar    @skipIfAsan  # The test process intentionally double-frees.
26d7c403e6SMed Ismail Bennani    @skipUnlessDarwin
27d7c403e6SMed Ismail Bennani    def test_cli(self):
28d7c403e6SMed Ismail Bennani        """Test that `process status --verbose` fetches the extended crash
29e9264b74SKazuaki Ishizaki        information dictionary from the command-line properly."""
30d7c403e6SMed Ismail Bennani        self.build()
31d7c403e6SMed Ismail Bennani        exe = self.getBuildArtifact("a.out")
32*2238dcc3SJonas Devlieghere        self.expect("file " + exe, patterns=["Current executable set to .*a.out"])
33d7c403e6SMed Ismail Bennani
34*2238dcc3SJonas Devlieghere        self.expect("process launch", patterns=["Process .* launched: .*a.out"])
35d7c403e6SMed Ismail Bennani
36*2238dcc3SJonas Devlieghere        self.expect(
37*2238dcc3SJonas Devlieghere            "process status --verbose",
38*2238dcc3SJonas Devlieghere            patterns=[
39*2238dcc3SJonas Devlieghere                "Extended Crash Information",
4078d6e1d1SMed Ismail Bennani                "Crash-Info Annotations",
41*2238dcc3SJonas Devlieghere                "pointer being freed was not allocated",
42*2238dcc3SJonas Devlieghere            ],
43*2238dcc3SJonas Devlieghere        )
44d7c403e6SMed Ismail Bennani
457822c8c0SVedant Kumar    @skipIfAsan  # The test process intentionally hits a memory bug.
46d7c403e6SMed Ismail Bennani    @skipUnlessDarwin
47d7c403e6SMed Ismail Bennani    def test_api(self):
48d7c403e6SMed Ismail Bennani        """Test that lldb can fetch a crashed process' extended crash information
49e9264b74SKazuaki Ishizaki        dictionary from the api properly."""
50d7c403e6SMed Ismail Bennani        self.build()
51d7c403e6SMed Ismail Bennani        target = self.dbg.CreateTarget(self.getBuildArtifact("a.out"))
52d7c403e6SMed Ismail Bennani        self.assertTrue(target, VALID_TARGET)
53d7c403e6SMed Ismail Bennani
54d7c403e6SMed Ismail Bennani        target.LaunchSimple(None, None, os.getcwd())
55d7c403e6SMed Ismail Bennani
56d7c403e6SMed Ismail Bennani        stream = lldb.SBStream()
57d7c403e6SMed Ismail Bennani        self.assertTrue(stream)
58d7c403e6SMed Ismail Bennani
59eefda182SMed Ismail Bennani        process = target.GetProcess()
60eefda182SMed Ismail Bennani        self.assertTrue(process)
61eefda182SMed Ismail Bennani
62eefda182SMed Ismail Bennani        crash_info = process.GetExtendedCrashInformation()
63d7c403e6SMed Ismail Bennani
64d7c403e6SMed Ismail Bennani        error = crash_info.GetAsJSON(stream)
65d7c403e6SMed Ismail Bennani
66779bbbf2SDave Lee        self.assertSuccess(error)
67d7c403e6SMed Ismail Bennani
68d7c403e6SMed Ismail Bennani        self.assertTrue(crash_info.IsValid())
69d7c403e6SMed Ismail Bennani
70d7c403e6SMed Ismail Bennani        self.assertIn("pointer being freed was not allocated", stream.GetData())
71d7c403e6SMed Ismail Bennani
728758d020SFred Riss    # dyld leaves permanent crash_info records when testing on device.
738758d020SFred Riss    @skipIfDarwinEmbedded
74d7c403e6SMed Ismail Bennani    def test_on_sane_process(self):
75d7c403e6SMed Ismail Bennani        """Test that lldb doesn't fetch the extended crash information
76e9264b74SKazuaki Ishizaki        dictionary from a 'sane' stopped process."""
77d7c403e6SMed Ismail Bennani        self.build()
78*2238dcc3SJonas Devlieghere        target, _, _, _ = lldbutil.run_to_line_breakpoint(
79*2238dcc3SJonas Devlieghere            self, lldb.SBFileSpec(self.source), self.line
80*2238dcc3SJonas Devlieghere        )
81d7c403e6SMed Ismail Bennani
82d7c403e6SMed Ismail Bennani        stream = lldb.SBStream()
83d7c403e6SMed Ismail Bennani        self.assertTrue(stream)
84d7c403e6SMed Ismail Bennani
85eefda182SMed Ismail Bennani        process = target.GetProcess()
86eefda182SMed Ismail Bennani        self.assertTrue(process)
87eefda182SMed Ismail Bennani
88eefda182SMed Ismail Bennani        crash_info = process.GetExtendedCrashInformation()
89d7c403e6SMed Ismail Bennani
90d7c403e6SMed Ismail Bennani        error = crash_info.GetAsJSON(stream)
91d7c403e6SMed Ismail Bennani        self.assertFalse(error.Success())
92d7c403e6SMed Ismail Bennani        self.assertIn("No structured data.", error.GetCString())
93