[Lldb-commits] [lldb] bff3891 - Fix a bug with setting breakpoints on C++11 inline initialization statements.

Jim Ingham via lldb-commits lldb-commits at lists.llvm.org
Wed Jan 20 17:59:46 PST 2021


Author: Jim Ingham
Date: 2021-01-20T17:58:34-08:00
New Revision: bff389120fa2368d123612449c938958cfd7f45e

URL: https://github.com/llvm/llvm-project/commit/bff389120fa2368d123612449c938958cfd7f45e
DIFF: https://github.com/llvm/llvm-project/commit/bff389120fa2368d123612449c938958cfd7f45e.diff

LOG: Fix a bug with setting breakpoints on C++11 inline initialization statements.

If they occurred before the constructor that used them, we would refuse to
set the breakpoint because we thought they were crossing function boundaries.

Differential Revision: https://reviews.llvm.org/D94846

Added: 
    lldb/test/API/lang/cpp/break-on-initializers/Makefile
    lldb/test/API/lang/cpp/break-on-initializers/TestBreakOnCPP11Initializers.py
    lldb/test/API/lang/cpp/break-on-initializers/main.cpp

Modified: 
    lldb/source/Breakpoint/BreakpointResolverFileLine.cpp

Removed: 
    


################################################################################
diff  --git a/lldb/source/Breakpoint/BreakpointResolverFileLine.cpp b/lldb/source/Breakpoint/BreakpointResolverFileLine.cpp
index 22a4b4ae33ae..5ca4ef5834e0 100644
--- a/lldb/source/Breakpoint/BreakpointResolverFileLine.cpp
+++ b/lldb/source/Breakpoint/BreakpointResolverFileLine.cpp
@@ -187,6 +187,14 @@ void BreakpointResolverFileLine::FilterContexts(SymbolContextList &sc_list,
     // is 0, then we can't do this calculation.  That can happen if
     // GetStartLineSourceInfo gets an error, or if the first line number in
     // the function really is 0 - which happens for some languages.
+    
+    // But only do this calculation if the line number we found in the SC
+    // was 
diff erent from the one requested in the source file.  If we actually
+    // found an exact match it must be valid.
+    
+    if (m_line_number == sc.line_entry.line)
+      continue;
+
     const int decl_line_is_too_late_fudge = 1;
     if (line && m_line_number < line - decl_line_is_too_late_fudge) {
       LLDB_LOG(log, "removing symbol context at {0}:{1}", file, line);

diff  --git a/lldb/test/API/lang/cpp/break-on-initializers/Makefile b/lldb/test/API/lang/cpp/break-on-initializers/Makefile
new file mode 100644
index 000000000000..7714f26e52bc
--- /dev/null
+++ b/lldb/test/API/lang/cpp/break-on-initializers/Makefile
@@ -0,0 +1,4 @@
+C_SOURCES := main.c
+CXXFLAGS_EXTRAS := -std=c++11
+
+include Makefile.rules

diff  --git a/lldb/test/API/lang/cpp/break-on-initializers/TestBreakOnCPP11Initializers.py b/lldb/test/API/lang/cpp/break-on-initializers/TestBreakOnCPP11Initializers.py
new file mode 100644
index 000000000000..8456a7cae96e
--- /dev/null
+++ b/lldb/test/API/lang/cpp/break-on-initializers/TestBreakOnCPP11Initializers.py
@@ -0,0 +1,52 @@
+"""
+When using C++11 in place member initialization, show that we
+can set and hit breakpoints on initialization lines.  This is a
+little bit tricky because we try not to move file and line breakpoints 
+across function boundaries but these lines are outside the source range
+of the constructor.
+"""
+
+
+
+import lldb
+import lldbsuite.test.lldbutil as lldbutil
+from lldbsuite.test.lldbtest import *
+
+
+class RenameThisSampleTestTestCase(TestBase):
+
+    mydir = TestBase.compute_mydir(__file__)
+
+    def test_breakpoints_on_initializers(self):
+        """Show we can set breakpoints on initializers appearing both before
+           and after the constructor body, and hit them."""
+        self.build()
+        self.main_source_file = lldb.SBFileSpec("main.cpp")
+        self.first_initializer_line = line_number("main.cpp", "Set the before constructor breakpoint here")
+        self.second_initializer_line = line_number("main.cpp", "Set the after constructor breakpoint here")
+        self.sample_test()
+
+    def setUp(self):
+        # Call super's setUp().
+        TestBase.setUp(self)
+        # Set up your test case here. If your test doesn't need any set up then
+        # remove this method from your TestCase class.
+
+    def sample_test(self):
+        """You might use the test implementation in several ways, say so here."""
+
+        (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(self,
+                                   " Set a breakpoint here to get started", self.main_source_file)
+
+        # Now set breakpoints on the two initializer lines we found in the test startup:
+        bkpt1 = target.BreakpointCreateByLocation(self.main_source_file, self.first_initializer_line)
+        self.assertEqual(bkpt1.GetNumLocations(), 1)
+        bkpt2 = target.BreakpointCreateByLocation(self.main_source_file, self.second_initializer_line)
+        self.assertEqual(bkpt2.GetNumLocations(), 1)
+
+        # Now continue, we should stop at the two breakpoints above, first the one before, then
+        # the one after.
+        self.assertEqual(len(lldbutil.continue_to_breakpoint(process, bkpt1)), 1, "Hit first breakpoint")
+        self.assertEqual(len(lldbutil.continue_to_breakpoint(process, bkpt2)), 1, "Hit second breakpoint")
+        
+

diff  --git a/lldb/test/API/lang/cpp/break-on-initializers/main.cpp b/lldb/test/API/lang/cpp/break-on-initializers/main.cpp
new file mode 100644
index 000000000000..13117a17940d
--- /dev/null
+++ b/lldb/test/API/lang/cpp/break-on-initializers/main.cpp
@@ -0,0 +1,31 @@
+#include <stdio.h>
+#include <vector>
+
+class Trivial {
+public:
+  Trivial(int input) : m_int(input) {}
+private:
+  int m_int;
+
+};
+
+class Foo {
+private:
+  Trivial m_trivial = Trivial(100); // Set the before constructor breakpoint here
+
+public:
+  Foo(int input) {
+    printf("I have been made!\n");
+  }
+
+private:
+  Trivial m_other_trivial = Trivial(200); // Set the after constructor breakpoint here
+};
+
+int
+main()
+{
+  Foo myFoo(10); // Set a breakpoint here to get started
+  return 0;
+}
+    


        


More information about the lldb-commits mailing list