RamNalamothu updated this revision to Diff 433784.
RamNalamothu retitled this revision from "[lldb] CommandObjectThreadUntil 
should set breakpoint at either on exact or the nearest subsequent line number 
but not on all the subsequent line numbers" to "[lldb] Fix thread step until to 
not set breakpoint(s) on incorrect line numbers".
RamNalamothu edited the summary of this revision.
RamNalamothu added a comment.
Herald added a project: LLDB.

Added the test coverage.

By the way, I am surprized that it looks like no else landed into this issue 
since the time I got into it during Aug/2018.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D50304/new/

https://reviews.llvm.org/D50304

Files:
  lldb/source/Commands/CommandObjectThread.cpp
  lldb/test/API/functionalities/thread/step_until/TestStepUntil.py


Index: lldb/test/API/functionalities/thread/step_until/TestStepUntil.py
===================================================================
--- lldb/test/API/functionalities/thread/step_until/TestStepUntil.py
+++ lldb/test/API/functionalities/thread/step_until/TestStepUntil.py
@@ -21,7 +21,7 @@
         self.greater_than_two = line_number('main.c', 'Greater than or equal 
to 2.')
         self.back_out_in_main = line_number('main.c', 'Back out in main')
 
-    def do_until (self, args, until_lines, expected_linenum):
+    def common_setup (self, args):
         self.build()
         exe = self.getBuildArtifact("a.out")
 
@@ -50,7 +50,8 @@
         thread = threads[0]
         return thread
 
-        thread = self.common_setup(None)
+    def do_until (self, args, until_lines, expected_linenum):
+        thread = self.common_setup(args)
 
         cmd_interp = self.dbg.GetCommandInterpreter()
         ret_obj = lldb.SBCommandReturnObject()
@@ -79,7 +80,7 @@
         self.do_until(None, [self.less_than_two, self.greater_than_two], 
self.less_than_two)
 
     def test_missing_one (self):
-        """Test thread step until - targeting one line and missing it."""
+        """Test thread step until - targeting one line and missing it by 
stepping out to call site"""
         self.do_until(["foo", "bar", "baz"], [self.less_than_two], 
self.back_out_in_main)
 
 
Index: lldb/source/Commands/CommandObjectThread.cpp
===================================================================
--- lldb/source/Commands/CommandObjectThread.cpp
+++ lldb/source/Commands/CommandObjectThread.cpp
@@ -1034,11 +1034,21 @@
         line_table->FindLineEntryByAddress(fun_end_addr, function_start,
                                            &end_ptr);
 
+        // Since not all source lines will contribute code, check if we are
+        // setting the breakpoint on the exact line number or the nearest
+        // subsequent line number and set breakpoints at all the line table
+        // entries of the chosen line number (exact or nearest subsequent).
         for (uint32_t line_number : line_numbers) {
+          LineEntry line_entry;
+          bool exact = false;
           uint32_t start_idx_ptr = index_ptr;
+          start_idx_ptr = sc.comp_unit->FindLineEntry(
+              index_ptr, line_number, nullptr, exact, &line_entry);
+          if (start_idx_ptr != UINT32_MAX)
+            line_number = line_entry.line;
+          exact = true;
+          start_idx_ptr = index_ptr;
           while (start_idx_ptr <= end_ptr) {
-            LineEntry line_entry;
-            const bool exact = false;
             start_idx_ptr = sc.comp_unit->FindLineEntry(
                 start_idx_ptr, line_number, nullptr, exact, &line_entry);
             if (start_idx_ptr == UINT32_MAX)


Index: lldb/test/API/functionalities/thread/step_until/TestStepUntil.py
===================================================================
--- lldb/test/API/functionalities/thread/step_until/TestStepUntil.py
+++ lldb/test/API/functionalities/thread/step_until/TestStepUntil.py
@@ -21,7 +21,7 @@
         self.greater_than_two = line_number('main.c', 'Greater than or equal to 2.')
         self.back_out_in_main = line_number('main.c', 'Back out in main')
 
-    def do_until (self, args, until_lines, expected_linenum):
+    def common_setup (self, args):
         self.build()
         exe = self.getBuildArtifact("a.out")
 
@@ -50,7 +50,8 @@
         thread = threads[0]
         return thread
 
-        thread = self.common_setup(None)
+    def do_until (self, args, until_lines, expected_linenum):
+        thread = self.common_setup(args)
 
         cmd_interp = self.dbg.GetCommandInterpreter()
         ret_obj = lldb.SBCommandReturnObject()
@@ -79,7 +80,7 @@
         self.do_until(None, [self.less_than_two, self.greater_than_two], self.less_than_two)
 
     def test_missing_one (self):
-        """Test thread step until - targeting one line and missing it."""
+        """Test thread step until - targeting one line and missing it by stepping out to call site"""
         self.do_until(["foo", "bar", "baz"], [self.less_than_two], self.back_out_in_main)
 
 
Index: lldb/source/Commands/CommandObjectThread.cpp
===================================================================
--- lldb/source/Commands/CommandObjectThread.cpp
+++ lldb/source/Commands/CommandObjectThread.cpp
@@ -1034,11 +1034,21 @@
         line_table->FindLineEntryByAddress(fun_end_addr, function_start,
                                            &end_ptr);
 
+        // Since not all source lines will contribute code, check if we are
+        // setting the breakpoint on the exact line number or the nearest
+        // subsequent line number and set breakpoints at all the line table
+        // entries of the chosen line number (exact or nearest subsequent).
         for (uint32_t line_number : line_numbers) {
+          LineEntry line_entry;
+          bool exact = false;
           uint32_t start_idx_ptr = index_ptr;
+          start_idx_ptr = sc.comp_unit->FindLineEntry(
+              index_ptr, line_number, nullptr, exact, &line_entry);
+          if (start_idx_ptr != UINT32_MAX)
+            line_number = line_entry.line;
+          exact = true;
+          start_idx_ptr = index_ptr;
           while (start_idx_ptr <= end_ptr) {
-            LineEntry line_entry;
-            const bool exact = false;
             start_idx_ptr = sc.comp_unit->FindLineEntry(
                 start_idx_ptr, line_number, nullptr, exact, &line_entry);
             if (start_idx_ptr == UINT32_MAX)
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
  • [Lldb-commits... Venkata Ramanaiah Nalamothu via Phabricator via lldb-commits
    • [Lldb-co... Venkata Ramanaiah Nalamothu via Phabricator via lldb-commits
    • [Lldb-co... Venkata Ramanaiah Nalamothu via Phabricator via lldb-commits
    • [Lldb-co... Venkata Ramanaiah Nalamothu via Phabricator via lldb-commits
    • [Lldb-co... Venkata Ramanaiah Nalamothu via Phabricator via lldb-commits
    • [Lldb-co... Jim Ingham via Phabricator via lldb-commits
    • [Lldb-co... Venkata Ramanaiah Nalamothu via Phabricator via lldb-commits
    • [Lldb-co... Venkata Ramanaiah Nalamothu via Phabricator via lldb-commits
    • [Lldb-co... Venkata Ramanaiah Nalamothu via Phabricator via lldb-commits
    • [Lldb-co... Jim Ingham via Phabricator via lldb-commits
    • [Lldb-co... Venkata Ramanaiah Nalamothu via Phabricator via lldb-commits

Reply via email to