90 lines · python
1"""Test lldb reloads the inferior after it was changed during the session."""2 3 4import time5import lldb6from lldbsuite.test.decorators import *7from lldbsuite.test.lldbtest import *8from lldbsuite.test import configuration9from lldbsuite.test import lldbutil10 11 12class ChangedInferiorTestCase(TestBase):13 @skipIf(hostoslist=["windows"])14 @no_debug_info_test15 def test_inferior_crashing(self):16 """Test lldb reloads the inferior after it was changed during the session."""17 self.build()18 self.inferior_crashing()19 self.cleanup()20 # lldb needs to recognize the inferior has changed. If lldb needs to check the21 # new module timestamp, make sure it is not the same as the old one, so add a22 # 1 second delay.23 time.sleep(1)24 d = {"C_SOURCES": "main2.c"}25 self.build(dictionary=d)26 self.setTearDownCleanup(dictionary=d)27 self.inferior_not_crashing()28 29 def setUp(self):30 # Call super's setUp().31 TestBase.setUp(self)32 # Find the line number of the crash.33 self.line1 = line_number("main.c", "// Crash here.")34 self.line2 = line_number("main2.c", "// Not crash here.")35 36 def inferior_crashing(self):37 """Inferior crashes upon launching; lldb should catch the event and stop."""38 self.exe = self.getBuildArtifact("a.out")39 self.runCmd("file " + self.exe, CURRENT_EXECUTABLE_SET)40 41 self.runCmd("run", RUN_SUCCEEDED)42 43 # We should have one crashing thread44 self.assertEqual(45 len(46 lldbutil.get_crashed_threads(47 self, self.dbg.GetSelectedTarget().GetProcess()48 )49 ),50 1,51 STOPPED_DUE_TO_EXC_BAD_ACCESS,52 )53 54 # And it should report the correct line number.55 self.expect("thread backtrace all", substrs=["main.c:%d" % self.line1])56 57 def inferior_not_crashing(self):58 """Test lldb reloads the inferior after it was changed during the session."""59 self.runCmd("process kill")60 self.runCmd("run", RUN_SUCCEEDED)61 self.runCmd("process status")62 63 self.assertNotEqual(64 len(65 lldbutil.get_crashed_threads(66 self, self.dbg.GetSelectedTarget().GetProcess()67 )68 ),69 1,70 "Inferior changed, but lldb did not perform a reload",71 )72 73 # Break inside the main.74 lldbutil.run_break_set_by_file_and_line(75 self, "main2.c", self.line2, num_expected_locations=1, loc_exact=True76 )77 78 self.runCmd("run", RUN_SUCCEEDED)79 80 # The stop reason of the thread should be breakpoint.81 self.expect(82 "thread list",83 STOPPED_DUE_TO_BREAKPOINT,84 substrs=["stopped", "stop reason = breakpoint"],85 )86 87 self.runCmd("frame variable int_ptr")88 self.expect("frame variable *int_ptr", substrs=["= 7"])89 self.expect("expression *int_ptr", substrs=["= 7"])90