Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Target] Do not skip a stop on a breakpoint if a plan was completed
Summary: This patch fixes the next situation. On Windows clang-cl makes no stub before the main function, so the main function is located exactly on module entry point. May be it is the same on other platforms. So consider the following sequence: - set a breakpoint on main and stop there; - try to evaluate expression, which requires a code execution on the debuggee side. Such an execution always returns to the module entry, and the plan waits for it there; - the plan understands that it is complete now and removes its breakpoint. But the breakpoint site is still there, because we also have a breakpoint on entry; - StopInfo analyzes a situation. It sees that we have stopped on the breakpoint site, and it sees that the breakpoint site has owners, and no one logical breakpoint is internal (because the plan is already completed and it have removed its breakpoint); - StopInfo thinks that it's a user breakpoint and skips it to avoid recursive computations; - the program continues. So in this situation the program continues without a stop right after the expression evaluation. To avoid this an additional check that the plan was completed was added. Reviewers: jingham, zturner, boris.ulasevich Reviewed by: jingham Tags: #lldb Differential Revision: https://reviews.llvm.org/D53761 llvm-svn: 347974
- Loading branch information
Aleksandr Urakov
committed
Nov 30, 2018
1 parent
bc96a98
commit 9b087d2
Showing
7 changed files
with
77 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
5 changes: 5 additions & 0 deletions
5
lldb/packages/Python/lldbsuite/test/functionalities/expr-entry-bp/Makefile
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
LEVEL = ../../make | ||
|
||
C_SOURCES := main.c | ||
|
||
include $(LEVEL)/Makefile.rules |
34 changes: 34 additions & 0 deletions
34
lldb/packages/Python/lldbsuite/test/functionalities/expr-entry-bp/TestExprEntryBP.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
""" | ||
Tests expressions evaluation when the breakpoint on module's entry is set. | ||
""" | ||
|
||
import lldb | ||
import lldbsuite.test.lldbutil as lldbutil | ||
from lldbsuite.test.lldbtest import * | ||
|
||
class ExprEntryBPTestCase(TestBase): | ||
|
||
mydir = TestBase.compute_mydir(__file__) | ||
|
||
NO_DEBUG_INFO_TESTCASE = True | ||
|
||
def test_expr_entry_bp(self): | ||
"""Tests expressions evaluation when the breakpoint on module's entry is set.""" | ||
self.build() | ||
self.main_source_file = lldb.SBFileSpec("main.c") | ||
|
||
(target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(self, "Set a breakpoint here", self.main_source_file) | ||
|
||
self.assertEqual(1, bkpt.GetNumLocations()) | ||
entry = bkpt.GetLocationAtIndex(0).GetAddress().GetModule().GetObjectFileEntryPointAddress() | ||
self.assertTrue(entry.IsValid(), "Can't get a module entry point") | ||
|
||
entry_bp = target.BreakpointCreateBySBAddress(entry) | ||
self.assertTrue(entry_bp.IsValid(), "Can't set a breakpoint on the module entry point") | ||
|
||
result = target.EvaluateExpression("sum(7, 1)") | ||
self.assertTrue(result.IsValid(), "Can't evaluate expression") | ||
self.assertEqual(8, result.GetValueAsSigned()) | ||
|
||
def setUp(self): | ||
TestBase.setUp(self) |
10 changes: 10 additions & 0 deletions
10
lldb/packages/Python/lldbsuite/test/functionalities/expr-entry-bp/main.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
#include <stdio.h> | ||
|
||
int sum(int x, int y) { | ||
return x + y; | ||
} | ||
|
||
int main() { | ||
printf("Set a breakpoint here.\n"); | ||
return sum(-1, 1); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters