199 lines · python
1"""2Test some lldb command abbreviations.3"""4 5import lldb6from lldbsuite.test.decorators import *7from lldbsuite.test.lldbtest import *8from lldbsuite.test import lldbutil9 10 11class ExecTestCase(TestBase):12 NO_DEBUG_INFO_TESTCASE = True13 14 @expectedFailureAll(15 archs=["i386"], oslist=no_match(["freebsd"]), bugnumber="rdar://28656532"16 )17 @expectedFailureAll(18 oslist=["ios", "tvos", "watchos", "bridgeos"],19 bugnumber="rdar://problem/34559552",20 ) # this exec test has problems on ios systems21 @expectedFailureNetBSD22 @skipIfAsan # rdar://problem/4375682323 @skipIfWindows24 def test_hitting_exec(self):25 self.do_test(False)26 27 @expectedFailureAll(28 archs=["i386"], oslist=no_match(["freebsd"]), bugnumber="rdar://28656532"29 )30 @expectedFailureAll(31 oslist=["ios", "tvos", "watchos", "bridgeos"],32 bugnumber="rdar://problem/34559552",33 ) # this exec test has problems on ios systems34 @expectedFailureNetBSD35 @skipIfAsan # rdar://problem/4375682336 @skipIfWindows37 def test_skipping_exec(self):38 self.do_test(True)39 40 def do_test(self, skip_exec):41 self.build()42 exe = self.getBuildArtifact("a.out")43 secondprog = self.getBuildArtifact("secondprog")44 45 # Create the target46 target = self.dbg.CreateTarget(exe)47 48 lldbutil.install_to_target(self, secondprog)49 50 # Create any breakpoints we need51 breakpoint1 = target.BreakpointCreateBySourceRegex(52 "Set breakpoint 1 here", lldb.SBFileSpec("main.c", False)53 )54 self.assertTrue(breakpoint1, VALID_BREAKPOINT)55 breakpoint2 = target.BreakpointCreateBySourceRegex(56 "Set breakpoint 2 here", lldb.SBFileSpec("secondprog.cpp", False)57 )58 self.assertTrue(breakpoint2, VALID_BREAKPOINT)59 60 # Launch the process61 process = target.LaunchSimple(None, None, self.get_process_working_directory())62 self.assertTrue(process, PROCESS_IS_VALID)63 64 if self.TraceOn():65 self.runCmd("settings show target.process.stop-on-exec", check=False)66 if skip_exec:67 self.dbg.HandleCommand("settings set target.process.stop-on-exec false")68 69 def cleanup():70 self.runCmd(71 "settings set target.process.stop-on-exec false", check=False72 )73 74 # Execute the cleanup function during test case tear down.75 self.addTearDownHook(cleanup)76 77 # The stop reason of the thread should be breakpoint.78 self.assertState(79 process.GetState(), lldb.eStateStopped, STOPPED_DUE_TO_BREAKPOINT80 )81 82 threads = lldbutil.get_threads_stopped_at_breakpoint(process, breakpoint1)83 self.assertEqual(len(threads), 1)84 85 # We had a deadlock tearing down the TypeSystemMap on exec, but only if some86 # expression had been evaluated. So make sure we do that here so the teardown87 # is not trivial.88 89 thread = threads[0]90 value = thread.frames[0].EvaluateExpression("1 + 2")91 self.assertTrue(value.IsValid(), "Expression evaluated successfully")92 int_value = value.GetValueAsSigned()93 self.assertEqual(int_value, 3, "Expression got the right result.")94 95 # Run and we should stop due to exec96 process.Continue()97 98 if not skip_exec:99 self.assertNotEqual(100 process.GetState(), lldb.eStateExited, "Process should not have exited!"101 )102 self.assertState(103 process.GetState(),104 lldb.eStateStopped,105 "Process should be stopped at __dyld_start",106 )107 108 threads = lldbutil.get_stopped_threads(process, lldb.eStopReasonExec)109 self.assertEqual(len(threads), 1, "We got a thread stopped for exec.")110 111 # Run and we should stop at breakpoint in main after exec112 process.Continue()113 114 self.assertState(process.GetState(), lldb.eStateStopped)115 for t in process.threads:116 if t.stop_reason != lldb.eStopReasonNone:117 self.assertStopReason(118 t.stop_reason, lldb.eStopReasonBreakpoint, "Unexpected stop reason"119 )120 if self.TraceOn():121 print(t)122 if t.stop_reason != lldb.eStopReasonBreakpoint:123 self.runCmd("bt")124 125 threads = lldbutil.get_threads_stopped_at_breakpoint(process, breakpoint2)126 self.assertEqual(len(threads), 1, "Stopped at breakpoint in exec'ed process.")127 128 @expectedFailureAll(129 archs=["i386"], oslist=no_match(["freebsd"]), bugnumber="rdar://28656532"130 )131 @expectedFailureAll(132 oslist=["ios", "tvos", "watchos", "bridgeos"],133 bugnumber="rdar://problem/34559552",134 ) # this exec test has problems on ios systems135 @expectedFailureNetBSD136 @skipIfAsan # rdar://problem/43756823137 @skipIfWindows138 def test_correct_thread_plan_state_before_exec(self):139 """140 In this test we make sure that the Thread* cache in the ThreadPlans141 is cleared correctly when performing exec142 """143 144 self.build()145 exe = self.getBuildArtifact("a.out")146 target = self.dbg.CreateTarget(exe)147 148 lldbutil.install_to_target(self, self.getBuildArtifact("secondprog"))149 150 (target, process, thread, breakpoint1) = lldbutil.run_to_source_breakpoint(151 self, "Set breakpoint 1 here", lldb.SBFileSpec("main.c", False)152 )153 154 # The stop reason of the thread should be breakpoint.155 self.assertState(156 process.GetState(), lldb.eStateStopped, STOPPED_DUE_TO_BREAKPOINT157 )158 159 threads = lldbutil.get_threads_stopped_at_breakpoint(process, breakpoint1)160 self.assertEqual(len(threads), 1)161 162 # We perform an instruction step, which effectively sets the cache of the base163 # thread plan, which should be cleared when a new thread list appears.164 #165 # Continuing after this instruction step will trigger a call to166 # ThreadPlan::ShouldReportRun, which sets the ThreadPlan's Thread cache to167 # the old Thread* value. In Process::UpdateThreadList we are clearing this168 # cache in preparation for the new ThreadList.169 #170 # Not doing this stepping will cause LLDB to first execute a private single step171 # past the current breakpoint, which eventually avoids the call to ShouldReportRun,172 # thus not setting the cache to its invalid value.173 thread.StepInstruction(False)174 175 # Run and we should stop due to exec176 breakpoint2 = target.BreakpointCreateBySourceRegex(177 "Set breakpoint 2 here", lldb.SBFileSpec("secondprog.cpp", False)178 )179 180 process.Continue()181 182 self.assertNotEqual(183 process.GetState(), lldb.eStateExited, "Process should not have exited!"184 )185 self.assertState(186 process.GetState(),187 lldb.eStateStopped,188 "Process should be stopped at __dyld_start",189 )190 191 threads = lldbutil.get_stopped_threads(process, lldb.eStopReasonExec)192 self.assertEqual(len(threads), 1, "We got a thread stopped for exec.")193 194 # Run and we should stop at breakpoint in main after exec195 process.Continue()196 197 threads = lldbutil.get_threads_stopped_at_breakpoint(process, breakpoint2)198 self.assertEqual(len(threads), 1, "Stopped at breakpoint in exec'ed process.")199