aleksandr.urakov created this revision.
aleksandr.urakov added reviewers: jingham, zturner, boris.ulasevich.
aleksandr.urakov added a project: LLDB.
Herald added subscribers: lldb-commits, teemperor.

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 I've added an additional check that the 
plan was completed.

The test is just the case I've caught, but it's Windows-only. It seems that the 
problem should exist on other platforms too, but I don't know how to test it in 
a cross-platform way (any tips are appreciated). The test depends on 
https://reviews.llvm.org/D53759.


Repository:
  rLLDB LLDB

https://reviews.llvm.org/D53761

Files:
  lit/SymbolFile/PDB/Inputs/BPOnEntryTest.cpp
  lit/SymbolFile/PDB/Inputs/BPOnEntryTest.script
  lit/SymbolFile/PDB/bp-on-entry.test
  source/Target/StopInfo.cpp


Index: source/Target/StopInfo.cpp
===================================================================
--- source/Target/StopInfo.cpp
+++ source/Target/StopInfo.cpp
@@ -333,6 +333,13 @@
             // commands when we see the same breakpoint hit a second time.
 
             m_should_stop_is_valid = true;
+
+            if (thread_sp->CompletedPlanOverridesBreakpoint()) {
+              m_should_stop = true;
+              thread_sp->ResetStopInfo();
+              return;
+            }
+
             if (log)
               log->Printf("StopInfoBreakpoint::PerformAction - Hit a "
                           "breakpoint while running an expression,"
Index: lit/SymbolFile/PDB/bp-on-entry.test
===================================================================
--- /dev/null
+++ lit/SymbolFile/PDB/bp-on-entry.test
@@ -0,0 +1,7 @@
+REQUIRES: windows
+RUN: clang-cl /Zi /GS- /c %S/Inputs/BPOnEntryTest.cpp /Fo%t.obj
+RUN: lld-link /debug:full /nodefaultlib /entry:main %t.obj /out:%t.exe
+RUN: %lldb -b -s %S/Inputs/BPOnEntryTest.script -- %t.exe | FileCheck %s
+
+CHECK: (lldb) print sum(3, 4)
+CHECK: (int) $0 = 7
Index: lit/SymbolFile/PDB/Inputs/BPOnEntryTest.script
===================================================================
--- /dev/null
+++ lit/SymbolFile/PDB/Inputs/BPOnEntryTest.script
@@ -0,0 +1,3 @@
+breakpoint set --file BPOnEntryTest.cpp --name main
+run
+print sum(3, 4)
Index: lit/SymbolFile/PDB/Inputs/BPOnEntryTest.cpp
===================================================================
--- /dev/null
+++ lit/SymbolFile/PDB/Inputs/BPOnEntryTest.cpp
@@ -0,0 +1,7 @@
+int sum(int a, int b) {
+  return a + b;
+}
+
+int main() {
+  return sum(-1, 1);
+}


Index: source/Target/StopInfo.cpp
===================================================================
--- source/Target/StopInfo.cpp
+++ source/Target/StopInfo.cpp
@@ -333,6 +333,13 @@
             // commands when we see the same breakpoint hit a second time.
 
             m_should_stop_is_valid = true;
+
+            if (thread_sp->CompletedPlanOverridesBreakpoint()) {
+              m_should_stop = true;
+              thread_sp->ResetStopInfo();
+              return;
+            }
+
             if (log)
               log->Printf("StopInfoBreakpoint::PerformAction - Hit a "
                           "breakpoint while running an expression,"
Index: lit/SymbolFile/PDB/bp-on-entry.test
===================================================================
--- /dev/null
+++ lit/SymbolFile/PDB/bp-on-entry.test
@@ -0,0 +1,7 @@
+REQUIRES: windows
+RUN: clang-cl /Zi /GS- /c %S/Inputs/BPOnEntryTest.cpp /Fo%t.obj
+RUN: lld-link /debug:full /nodefaultlib /entry:main %t.obj /out:%t.exe
+RUN: %lldb -b -s %S/Inputs/BPOnEntryTest.script -- %t.exe | FileCheck %s
+
+CHECK: (lldb) print sum(3, 4)
+CHECK: (int) $0 = 7
Index: lit/SymbolFile/PDB/Inputs/BPOnEntryTest.script
===================================================================
--- /dev/null
+++ lit/SymbolFile/PDB/Inputs/BPOnEntryTest.script
@@ -0,0 +1,3 @@
+breakpoint set --file BPOnEntryTest.cpp --name main
+run
+print sum(3, 4)
Index: lit/SymbolFile/PDB/Inputs/BPOnEntryTest.cpp
===================================================================
--- /dev/null
+++ lit/SymbolFile/PDB/Inputs/BPOnEntryTest.cpp
@@ -0,0 +1,7 @@
+int sum(int a, int b) {
+  return a + b;
+}
+
+int main() {
+  return sum(-1, 1);
+}
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to