[Lldb-commits] [PATCH] D66241: stop-hooks don't fire on "step-out"

Jim Ingham via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Wed Aug 14 12:38:40 PDT 2019


jingham created this revision.
jingham added a reviewer: clayborg.
Herald added subscribers: lldb-commits, abidh.
Herald added a project: LLDB.

Step hooks were not firing when you did a "step out".

This was because, when a breakpoint's PerformAction observes that the breakpoint has completed a plan, it resets the thread StopInfo so that the completed plan will be reported as the stop reason, not the trap that is the private stop reason.  But for no good reason that I can remember, it doesn't immediately reset the StopInfo to the completed plan one, but lets that happen the next time somebody gets the stop reason.  That didn't happen by the time stop-hooks checked if the thread had a stop reason.

We could make the stop-hooks force the StopInfo to get recomputed, but that might happen somewhere else as well.  It's better to just do it right away.

I also added a test for this case.


Repository:
  rLLDB LLDB

https://reviews.llvm.org/D66241

Files:
  packages/Python/lldbsuite/test/functionalities/stop-hooks/Makefile
  packages/Python/lldbsuite/test/functionalities/stop-hooks/TestStopHooks.py
  packages/Python/lldbsuite/test/functionalities/stop-hooks/main.c
  source/Target/StopInfo.cpp


Index: packages/Python/lldbsuite/test/functionalities/stop-hooks/main.c
===================================================================
--- packages/Python/lldbsuite/test/functionalities/stop-hooks/main.c
+++ packages/Python/lldbsuite/test/functionalities/stop-hooks/main.c
@@ -0,0 +1,14 @@
+#include <stdio.h>
+
+static int g_var = 0;
+
+int step_out_of_me()
+{
+  return g_var; // Set a breakpoint here and step out.
+}
+
+int
+main()
+{
+  return step_out_of_me();
+}
Index: packages/Python/lldbsuite/test/functionalities/stop-hooks/TestStopHooks.py
===================================================================
--- packages/Python/lldbsuite/test/functionalities/stop-hooks/TestStopHooks.py
+++ packages/Python/lldbsuite/test/functionalities/stop-hooks/TestStopHooks.py
@@ -0,0 +1,45 @@
+"""
+Test that stop hooks trigger on "step-out"
+"""
+
+from __future__ import print_function
+
+
+import lldb
+import lldbsuite.test.lldbutil as lldbutil
+from lldbsuite.test.lldbtest import *
+
+
+class TestStopHooks(TestBase):
+
+    mydir = TestBase.compute_mydir(__file__)
+
+    # If your test case doesn't stress debug info, the
+    # set this to true.  That way it won't be run once for
+    # each debug info format.
+    NO_DEBUG_INFO_TESTCASE = True
+
+    def test_stop_hooks_step_out(self):
+        """Test that stop hooks fire on step-out."""
+        self.build()
+        self.main_source_file = lldb.SBFileSpec("main.c")
+        self.step_out_test()
+
+    def setUp(self):
+        # Call super's setUp().
+        TestBase.setUp(self)
+
+    def step_out_test(self):
+        (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(self,
+                                   "Set a breakpoint here", self.main_source_file)
+
+        interp = self.dbg.GetCommandInterpreter()
+        result = lldb.SBCommandReturnObject()
+        interp.HandleCommand("target stop-hook add -o 'expr g_var++'", result)
+        self.assertTrue(result.Succeeded, "Set the target stop hook")
+        thread.StepOut()
+        var = target.FindFirstGlobalVariable("g_var")
+        self.assertTrue(var.IsValid())
+        self.assertEqual(var.GetValueAsUnsigned(), 1, "Updated g_var")
+
+
Index: packages/Python/lldbsuite/test/functionalities/stop-hooks/Makefile
===================================================================
--- packages/Python/lldbsuite/test/functionalities/stop-hooks/Makefile
+++ packages/Python/lldbsuite/test/functionalities/stop-hooks/Makefile
@@ -0,0 +1,6 @@
+LEVEL = ../../make
+
+C_SOURCES := main.c
+CFLAGS_EXTRAS += -std=c99
+
+include $(LEVEL)/Makefile.rules
Index: source/Target/StopInfo.cpp
===================================================================
--- source/Target/StopInfo.cpp
+++ source/Target/StopInfo.cpp
@@ -547,6 +547,7 @@
         // find the appropriate stop info, which should be the stop info
         // related to the completed plan
         thread_sp->ResetStopInfo();
+        thread_sp->SetStopInfo(thread_sp->GetStopInfo());
       }
 
       LLDB_LOGF(log,


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D66241.215201.patch
Type: text/x-patch
Size: 3039 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20190814/675f9130/attachment.bin>


More information about the lldb-commits mailing list