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