From f4d427326539f007b05378eaf66018c10b651ad0 Mon Sep 17 00:00:00 2001 From: Jim Ingham Date: Wed, 3 Jun 2020 14:29:22 -0700 Subject: [PATCH] Add a test for preserving state on the non-expr thread across expression evaluation. There may be another test that tests this but I couldn't find one. --- .../thread/state_after_expression/Makefile | 6 +++ .../TestStateAfterExpression.py | 53 +++++++++++++++++++ .../thread/state_after_expression/main.cpp | 14 +++++ 3 files changed, 73 insertions(+) create mode 100644 lldb/test/API/functionalities/thread/state_after_expression/Makefile create mode 100644 lldb/test/API/functionalities/thread/state_after_expression/TestStateAfterExpression.py create mode 100644 lldb/test/API/functionalities/thread/state_after_expression/main.cpp diff --git a/lldb/test/API/functionalities/thread/state_after_expression/Makefile b/lldb/test/API/functionalities/thread/state_after_expression/Makefile new file mode 100644 index 000000000000..d7aace51bc82 --- /dev/null +++ b/lldb/test/API/functionalities/thread/state_after_expression/Makefile @@ -0,0 +1,6 @@ +CXX_SOURCES := main.cpp +CFLAGS_EXTRAS := -std=c++11 + +ENABLE_THREADS := YES + +include Makefile.rules diff --git a/lldb/test/API/functionalities/thread/state_after_expression/TestStateAfterExpression.py b/lldb/test/API/functionalities/thread/state_after_expression/TestStateAfterExpression.py new file mode 100644 index 000000000000..082b556dbdce --- /dev/null +++ b/lldb/test/API/functionalities/thread/state_after_expression/TestStateAfterExpression.py @@ -0,0 +1,53 @@ +""" +Make sure the stop reason of a thread that did not run +during an expression is not changed by running the expression +""" + + + +import lldb +import lldbsuite.test.lldbutil as lldbutil +from lldbsuite.test.lldbtest import * + + +class TestStopReasonAfterExpression(TestBase): + + mydir = TestBase.compute_mydir(__file__) + + def test_thread_state_after_expr(self): + self.build() + self.main_source_file = lldb.SBFileSpec("main.cpp") + self.do_test() + + def do_test(self): + (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(self, + "Set a breakpoint here", self.main_source_file) + + self.assertEqual(bkpt.GetNumLocations(), 2, "Got two locations") + + # So now thread holds the main thread. Continue to hit the + # breakpoint again on the spawned thread: + + threads = lldbutil.continue_to_breakpoint(process, bkpt) + self.assertEqual(len(threads), 1, "Hit the breakpoint the second time") + other_thread = threads[0] + + self.assertNotEqual(thread.GetThreadID(), other_thread.GetThreadID(), + "A different thread") + # Run an expression ONLY on other_thread. Don't let thread run: + options = lldb.SBExpressionOptions() + options.SetTryAllThreads(False) + options.SetStopOthers(True) + + result = thread.frames[0].EvaluateExpression('(int) printf("Hello\\n")', options) + self.assertTrue(result.GetError().Success(), + "Expression failed: '%s'"%(result.GetError().GetCString())) + + stop_reason = other_thread.GetStopReason() + + self.assertEqual(stop_reason, lldb.eStopReasonBreakpoint, + "Still records stopped at breakpoint: %s" + %(lldbutil.stop_reason_to_str(stop_reason))) + self.assertEqual(other_thread.GetStopReasonDataAtIndex(0), 1, + "Still records stopped at right breakpoint") + diff --git a/lldb/test/API/functionalities/thread/state_after_expression/main.cpp b/lldb/test/API/functionalities/thread/state_after_expression/main.cpp new file mode 100644 index 000000000000..338232ece632 --- /dev/null +++ b/lldb/test/API/functionalities/thread/state_after_expression/main.cpp @@ -0,0 +1,14 @@ +#include + +void thread_func() { + // Set a breakpoint here +} + +int +main() +{ + // Set a breakpoint here + std::thread stopped_thread(thread_func); + stopped_thread.join(); + return 0; +}