fallkrum created this revision.
fallkrum added reviewers: clayborg, jingham.
fallkrum added a project: LLDB.

Encountered the following situation: Let we started thread T1 and it hit 
breakpoint on B1 <https://reviews.llvm.org/B1> location.  We suspended T1 and 
continued the process. Then we started thread T2 which hit for example the same 
location B1 <https://reviews.llvm.org/B1>. This time in a breakpoint callback 
we decided not to stop returning false.

Expected result: process continues (as if T2 did not hit breakpoint) its 
workflow with T1 still suspended.
Real result: process do stops (as if T2 callback returned true).

Solution: We need somehow invalidate StopInfo for threads that was previously 
suspended just because something that is already inactive can not be the reason 
of stop.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D80112

Files:
  lldb/source/Target/Thread.cpp


Index: lldb/source/Target/Thread.cpp
===================================================================
--- lldb/source/Target/Thread.cpp
+++ lldb/source/Target/Thread.cpp
@@ -378,7 +378,8 @@
     const uint32_t process_stop_id = process_sp->GetStopID();
     if (m_stop_info_stop_id != process_stop_id) {
       if (m_stop_info_sp) {
-        if (m_stop_info_sp->IsValid() || IsStillAtLastBreakpointHit() ||
+        if (m_stop_info_sp->IsValid() ||
+            (IsStillAtLastBreakpointHit() && m_resume_state != 
eStateSuspended) ||
             GetCurrentPlan()->IsVirtualStep())
           SetStopInfo(m_stop_info_sp);
         else


Index: lldb/source/Target/Thread.cpp
===================================================================
--- lldb/source/Target/Thread.cpp
+++ lldb/source/Target/Thread.cpp
@@ -378,7 +378,8 @@
     const uint32_t process_stop_id = process_sp->GetStopID();
     if (m_stop_info_stop_id != process_stop_id) {
       if (m_stop_info_sp) {
-        if (m_stop_info_sp->IsValid() || IsStillAtLastBreakpointHit() ||
+        if (m_stop_info_sp->IsValid() ||
+            (IsStillAtLastBreakpointHit() && m_resume_state != eStateSuspended) ||
             GetCurrentPlan()->IsVirtualStep())
           SetStopInfo(m_stop_info_sp);
         else
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to