131 lines · python
1"""2Test process attach.3"""4 5 6import os7import lldb8import shutil9from lldbsuite.test.decorators import *10from lldbsuite.test.lldbtest import *11from lldbsuite.test import lldbutil12 13exe_name = "ProcessAttach" # Must match Makefile14 15 16class ProcessAttachTestCase(TestBase):17 NO_DEBUG_INFO_TESTCASE = True18 19 def setUp(self):20 # Call super's setUp().21 TestBase.setUp(self)22 # Find the line number to break for main.c.23 self.line = line_number("main.cpp", "// Waiting to be attached...")24 25 @skipIfiOSSimulator26 def test_attach_to_process_by_id(self):27 """Test attach by process id"""28 self.build()29 exe = self.getBuildArtifact(exe_name)30 31 # Spawn a new process32 popen = self.spawnSubprocess(exe)33 34 self.runCmd("process attach -p " + str(popen.pid))35 36 target = self.dbg.GetSelectedTarget()37 38 process = target.GetProcess()39 self.assertTrue(process, PROCESS_IS_VALID)40 41 @skipIfiOSSimulator42 def test_attach_to_process_by_id_autocontinue(self):43 """Test attach by process id"""44 self.build()45 exe = self.getBuildArtifact(exe_name)46 47 # Spawn a new process48 popen = self.spawnSubprocess(exe)49 50 self.runCmd("process attach -c -p " + str(popen.pid))51 52 target = self.dbg.GetSelectedTarget()53 54 process = target.GetProcess()55 self.assertTrue(process, PROCESS_IS_VALID)56 self.assertTrue(process.GetState(), lldb.eStateRunning)57 58 @skipIfWindows # This is flakey on Windows AND when it fails, it hangs: llvm.org/pr4880659 def test_attach_to_process_from_different_dir_by_id(self):60 """Test attach by process id"""61 newdir = self.getBuildArtifact("newdir")62 try:63 os.mkdir(newdir)64 except OSError as e:65 if e.errno != os.errno.EEXIST:66 raise67 testdir = self.getBuildDir()68 exe = os.path.join(newdir, "proc_attach")69 self.buildProgram("main.cpp", exe)70 self.addTearDownHook(lambda: shutil.rmtree(newdir))71 72 # Spawn a new process73 popen = self.spawnSubprocess(exe)74 75 os.chdir(newdir)76 sourcedir = self.getSourceDir()77 self.addTearDownHook(lambda: os.chdir(sourcedir))78 self.runCmd("process attach -p " + str(popen.pid))79 80 target = self.dbg.GetSelectedTarget()81 82 process = target.GetProcess()83 self.assertTrue(process, PROCESS_IS_VALID)84 85 def test_attach_to_process_by_name(self):86 """Test attach by process name"""87 self.build()88 exe = self.getBuildArtifact(exe_name)89 90 # Spawn a new process91 popen = self.spawnSubprocess(exe)92 93 self.runCmd("process attach -n " + exe_name)94 95 target = self.dbg.GetSelectedTarget()96 97 process = target.GetProcess()98 self.assertTrue(process, PROCESS_IS_VALID)99 100 @skipIfWindows # This test is flaky on Windows101 @expectedFailureNetBSD102 def test_attach_to_process_by_id_correct_executable_offset(self):103 """104 Test that after attaching to a process the executable offset105 is determined correctly on FreeBSD. This is a regression test106 for dyld plugin getting the correct executable path,107 and therefore being able to identify it in the module list.108 """109 110 self.build()111 exe = self.getBuildArtifact(exe_name)112 113 # In order to reproduce, we must spawn using a relative path114 popen = self.spawnSubprocess(os.path.relpath(exe))115 116 self.runCmd("process attach -p " + str(popen.pid))117 118 # Make sure we did not attach too early.119 lldbutil.run_break_set_by_file_and_line(120 self, "main.cpp", self.line, num_expected_locations=1, loc_exact=False121 )122 self.runCmd("process continue")123 self.expect("v g_val", substrs=["12345"])124 125 def tearDown(self):126 # Destroy process before TestBase.tearDown()127 self.dbg.GetSelectedTarget().GetProcess().Destroy()128 129 # Call super's tearDown().130 TestBase.tearDown(self)131