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