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