================ @@ -0,0 +1,169 @@ +""" +Test the use of the global module cache in lldb +""" + +import lldb + +from lldbsuite.test.decorators import * +from lldbsuite.test.lldbtest import * +from lldbsuite.test import lldbutil +import os +import shutil +from pathlib import Path +import time + +class GlobalModuleCacheTestCase(TestBase): + # NO_DEBUG_INFO_TESTCASE = True + + def check_counter_var(self, thread, value): + frame = thread.frames[0] + var = frame.FindVariable("counter") + self.assertTrue(var.GetError().Success(), "Got counter variable") + self.assertEqual(var.GetValueAsUnsigned(), value, "This was one-print") + + def copy_to_main(self, src, dst): + # We are relying on the source file being newer than the .o file from + # a previous build, so sleep a bit here to ensure that the touch is later. + time.sleep(2) + try: + shutil.copy(src, dst) + except: + self.fail(f"Could not copy {src} to {dst}") + Path(dst).touch() + + # The rerun tests indicate rerunning on Windows doesn't really work, so + # this one won't either. + @skipIfWindows + def test_OneTargetOneDebugger(self): + self.do_test(True, True) + + # This behaves as implemented but that behavior is not desirable. + # This test tests for the desired behavior as an expected fail. + @skipIfWindows + @expectedFailureAll + def test_TwoTargetsOneDebugger(self): + self.do_test(False, True) + + @skipIfWindows + @expectedFailureAll + def test_OneTargetTwoDebuggers(self): + self.do_test(True, False) + + def do_test(self, one_target, one_debugger): + # Make sure that if we have one target, and we run, then + # change the binary and rerun, the binary (and any .o files + # if using dwarf in .o file debugging) get removed from the + # shared module cache. They are no longer reachable. + debug_style = self.getDebugInfo() + + # Before we do anything, clear the global module cache so we don't + # see objects from other runs: + lldb.SBDebugger.MemoryPressureDetected() + + # Set up the paths for our two versions of main.c: + main_c_path = os.path.join(self.getBuildDir(), "main.c") + one_print_path = os.path.join(self.getSourceDir(), "one-print.c") + two_print_path = os.path.join(self.getSourceDir(), "two-print.c") + main_filespec = lldb.SBFileSpec(main_c_path) + + # First copy the one-print.c to main.c in the build folder and + # build our a.out from there: + self.copy_to_main(one_print_path, main_c_path) + self.build(dictionary={"C_SOURCES": main_c_path, "EXE": "a.out"}) + + (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint( + self, "return counter;", main_filespec + ) + + # Make sure we ran the version we intended here: + self.check_counter_var(thread, 1) + process.Kill() + + # Now copy two-print.c over main.c, rebuild, and rerun: + # os.unlink(target.GetExecutable().fullpath) ---------------- DavidSpickett wrote:
Also commented out code here. https://github.com/llvm/llvm-project/pull/74894 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits