Add a setting to force stepping to always run all threads.

Also allow ScriptedThreadPlans to set & get their StopOthers
state.

<rdar://problem/64229484>

Differential Revision: https://reviews.llvm.org/D85265
This commit is contained in:
Jim Ingham
2020-08-07 14:44:01 -07:00
parent 71a1f135e4
commit d3dfd8cec4
12 changed files with 136 additions and 16 deletions

View File

@@ -1,7 +1,7 @@
"""
Tests stepping with scripted thread plans.
"""
import threading
import lldb
import lldbsuite.test.lldbutil as lldbutil
from lldbsuite.test.decorators import *
@@ -111,3 +111,58 @@ class StepScriptedTestCase(TestBase):
# And foo should have changed:
self.assertTrue(foo_val.GetValueDidChange(), "Foo changed")
def test_stop_others_from_command(self):
"""Test that the stop-others flag is set correctly by the command line.
Also test that the run-all-threads property overrides this."""
self.do_test_stop_others()
def run_step(self, stop_others_value, run_mode, token):
import Steps
interp = self.dbg.GetCommandInterpreter()
result = lldb.SBCommandReturnObject()
cmd = "thread step-scripted -C Steps.StepReportsStopOthers -k token -v %s"%(token)
if run_mode != None:
cmd = cmd + " --run-mode %s"%(run_mode)
print(cmd)
interp.HandleCommand(cmd, result)
self.assertTrue(result.Succeeded(), "Step scripted failed: %s."%(result.GetError()))
print(Steps.StepReportsStopOthers.stop_mode_dict)
value = Steps.StepReportsStopOthers.stop_mode_dict[token]
self.assertEqual(value, stop_others_value, "Stop others has the correct value.")
def do_test_stop_others(self):
self.build()
(target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(self,
"Set a breakpoint here",
self.main_source_file)
# First run with stop others false and see that we got that.
thread_id = ""
if sys.version_info.major == 2:
thread_id = str(threading._get_ident())
else:
thread_id = str(threading.get_ident())
# all-threads should set stop others to False.
self.run_step(False, "all-threads", thread_id)
# this-thread should set stop others to True
self.run_step(True, "this-thread", thread_id)
# The default value should be stop others:
self.run_step(True, None, thread_id)
# The target.process.run-all-threads should override this:
interp = self.dbg.GetCommandInterpreter()
result = lldb.SBCommandReturnObject()
interp.HandleCommand("settings set target.process.run-all-threads true", result)
self.assertTrue(result.Succeeded, "setting run-all-threads works.")
self.run_step(False, None, thread_id)