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
16d7c403e6SMed Ismail Bennani    def setUp(self):
17d7c403e6SMed Ismail Bennani        TestBase.setUp(self)
18d7c403e6SMed Ismail Bennani        self.runCmd("settings set auto-confirm true")
19d7c403e6SMed Ismail Bennani        self.source = "main.c"
20eefda182SMed Ismail Bennani        self.line = line_number(self.source, '// break here')
21d7c403e6SMed Ismail Bennani
22d7c403e6SMed Ismail Bennani    def tearDown(self):
23d7c403e6SMed Ismail Bennani        self.runCmd("settings clear auto-confirm")
24d7c403e6SMed Ismail Bennani        TestBase.tearDown(self)
25d7c403e6SMed Ismail Bennani
267822c8c0SVedant Kumar    @skipIfAsan # The test process intentionally double-frees.
27d7c403e6SMed Ismail Bennani    @skipUnlessDarwin
28d7c403e6SMed Ismail Bennani    def test_cli(self):
29d7c403e6SMed Ismail Bennani        """Test that `process status --verbose` fetches the extended crash
30e9264b74SKazuaki Ishizaki        information dictionary from the command-line properly."""
31d7c403e6SMed Ismail Bennani        self.build()
32d7c403e6SMed Ismail Bennani        exe = self.getBuildArtifact("a.out")
33d7c403e6SMed Ismail Bennani        self.expect("file " + exe,
34d7c403e6SMed Ismail Bennani                    patterns=["Current executable set to .*a.out"])
35d7c403e6SMed Ismail Bennani
36d7c403e6SMed Ismail Bennani        self.expect('process launch',
37d7c403e6SMed Ismail Bennani                    patterns=["Process .* launched: .*a.out"])
38d7c403e6SMed Ismail Bennani
39d7c403e6SMed Ismail Bennani        self.expect('process status --verbose',
40d7c403e6SMed Ismail Bennani                    patterns=["\"message\".*pointer being freed was not allocated"])
41d7c403e6SMed Ismail Bennani
42d7c403e6SMed Ismail Bennani
437822c8c0SVedant Kumar    @skipIfAsan # The test process intentionally hits a memory bug.
44d7c403e6SMed Ismail Bennani    @skipUnlessDarwin
45d7c403e6SMed Ismail Bennani    def test_api(self):
46d7c403e6SMed Ismail Bennani        """Test that lldb can fetch a crashed process' extended crash information
47e9264b74SKazuaki Ishizaki        dictionary from the api properly."""
48d7c403e6SMed Ismail Bennani        self.build()
49d7c403e6SMed Ismail Bennani        target = self.dbg.CreateTarget(self.getBuildArtifact("a.out"))
50d7c403e6SMed Ismail Bennani        self.assertTrue(target, VALID_TARGET)
51d7c403e6SMed Ismail Bennani
52d7c403e6SMed Ismail Bennani        target.LaunchSimple(None, None, os.getcwd())
53d7c403e6SMed Ismail Bennani
54d7c403e6SMed Ismail Bennani        stream = lldb.SBStream()
55d7c403e6SMed Ismail Bennani        self.assertTrue(stream)
56d7c403e6SMed Ismail Bennani
57eefda182SMed Ismail Bennani        process = target.GetProcess()
58eefda182SMed Ismail Bennani        self.assertTrue(process)
59eefda182SMed Ismail Bennani
60eefda182SMed Ismail Bennani        crash_info = process.GetExtendedCrashInformation()
61d7c403e6SMed Ismail Bennani
62d7c403e6SMed Ismail Bennani        error = crash_info.GetAsJSON(stream)
63d7c403e6SMed Ismail Bennani
64*779bbbf2SDave Lee        self.assertSuccess(error)
65d7c403e6SMed Ismail Bennani
66d7c403e6SMed Ismail Bennani        self.assertTrue(crash_info.IsValid())
67d7c403e6SMed Ismail Bennani
68d7c403e6SMed Ismail Bennani        self.assertIn("pointer being freed was not allocated", stream.GetData())
69d7c403e6SMed Ismail Bennani
708758d020SFred Riss    # dyld leaves permanent crash_info records when testing on device.
718758d020SFred Riss    @skipIfDarwinEmbedded
72d7c403e6SMed Ismail Bennani    def test_on_sane_process(self):
73d7c403e6SMed Ismail Bennani        """Test that lldb doesn't fetch the extended crash information
74e9264b74SKazuaki Ishizaki        dictionary from a 'sane' stopped process."""
75d7c403e6SMed Ismail Bennani        self.build()
76d7c403e6SMed Ismail Bennani        target, _, _, _ = lldbutil.run_to_line_breakpoint(self, lldb.SBFileSpec(self.source),
77d7c403e6SMed Ismail Bennani                                        self.line)
78d7c403e6SMed Ismail Bennani
79d7c403e6SMed Ismail Bennani        stream = lldb.SBStream()
80d7c403e6SMed Ismail Bennani        self.assertTrue(stream)
81d7c403e6SMed Ismail Bennani
82eefda182SMed Ismail Bennani        process = target.GetProcess()
83eefda182SMed Ismail Bennani        self.assertTrue(process)
84eefda182SMed Ismail Bennani
85eefda182SMed Ismail Bennani        crash_info = process.GetExtendedCrashInformation()
86d7c403e6SMed Ismail Bennani
87d7c403e6SMed Ismail Bennani        error = crash_info.GetAsJSON(stream)
88d7c403e6SMed Ismail Bennani        self.assertFalse(error.Success())
89d7c403e6SMed Ismail Bennani        self.assertIn("No structured data.", error.GetCString())
90