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