From: Jim Ingham Date: Thu, 30 Sep 2021 02:38:09 +0000 (-0700) Subject: Make "process attach -c" work correctly, and add a test for it. X-Git-Tag: upstream/15.0.7~30083 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2303391d1f543f4e57f9ed0fc68bad2d4cf890dc;p=platform%2Fupstream%2Fllvm.git Make "process attach -c" work correctly, and add a test for it. The issue here was that we were not updating the interpreter's execution context when calling HandleCommand to continue the process. Since we had just created the process, it wasn't in the interpreter's execution context so HandleCommand failed at CheckRequirements. The patch fixes that by passing the process execution context directly to HandleCommand. Differential Revision: https://reviews.llvm.org/D110787 --- diff --git a/lldb/source/Commands/CommandObjectProcess.cpp b/lldb/source/Commands/CommandObjectProcess.cpp index b3e2f6a1a02b..f3d20b390c6d 100644 --- a/lldb/source/Commands/CommandObjectProcess.cpp +++ b/lldb/source/Commands/CommandObjectProcess.cpp @@ -398,9 +398,10 @@ protected: } StreamString stream; + ProcessSP process_sp; const auto error = target->Attach(m_options.attach_info, &stream); if (error.Success()) { - ProcessSP process_sp(target->GetProcessSP()); + process_sp = target->GetProcessSP(); if (process_sp) { result.AppendMessage(stream.GetString()); result.SetStatus(eReturnStatusSuccessFinishNoResult); @@ -452,8 +453,13 @@ protected: // This supports the use-case scenario of immediately continuing the // process once attached. - if (m_options.attach_info.GetContinueOnceAttached()) - m_interpreter.HandleCommand("process continue", eLazyBoolNo, result); + if (m_options.attach_info.GetContinueOnceAttached()) { + // We have made a process but haven't told the interpreter about it yet, + // so CheckRequirements will fail for "process continue". Set the override + // here: + ExecutionContext exe_ctx(process_sp); + m_interpreter.HandleCommand("process continue", eLazyBoolNo, exe_ctx, result); + } return result.Succeeded(); } diff --git a/lldb/test/API/commands/process/attach/TestProcessAttach.py b/lldb/test/API/commands/process/attach/TestProcessAttach.py index b33aeebccdd1..4738ee5851e7 100644 --- a/lldb/test/API/commands/process/attach/TestProcessAttach.py +++ b/lldb/test/API/commands/process/attach/TestProcessAttach.py @@ -43,6 +43,23 @@ class ProcessAttachTestCase(TestBase): process = target.GetProcess() self.assertTrue(process, PROCESS_IS_VALID) + @skipIfiOSSimulator + def test_attach_to_process_by_id_autocontinue(self): + """Test attach by process id""" + self.build() + exe = self.getBuildArtifact(exe_name) + + # Spawn a new process + popen = self.spawnSubprocess(exe) + + self.runCmd("process attach -c -p " + str(popen.pid)) + + target = self.dbg.GetSelectedTarget() + + process = target.GetProcess() + self.assertTrue(process, PROCESS_IS_VALID) + self.assertTrue(process.GetState(), lldb.eStateRunning) + @skipIfReproducer # FIXME: Unexpected packet during (active) replay @skipIfWindows # This is flakey on Windows AND when it fails, it hangs: llvm.org/pr48806 def test_attach_to_process_from_different_dir_by_id(self):