Skip to content

[lldb] fix software breakpoint removing in multithreaded process while stepping #127506

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

dlav-sc
Copy link
Contributor

@dlav-sc dlav-sc commented Feb 17, 2025

I have encountered with the issue that sometimes lldb-server can't remove internal software breakpoints in a multithread process and as a result the process freezes.

The source of the issue was that lldb-server tried to read/write memory of the process using a tid of the exited thread and received 'No such process' error from ptrace.

This patch sets an existing thread as the current one for this process before software breakpoints removing.

…e stepping

I have encountered with the issue that sometimes lldb-server can't remove
internal software breakpoints in a multithread process and as a result
the process freezes.

The source of the issue was that lldb-server tried to read/write memory
of the process using a tid of the exited thread and received 'No such
process' error from ptrace.

This patch sets an existing thread as the current one for this process
before software breakpoints removing.
@llvmbot
Copy link
Member

llvmbot commented Feb 17, 2025

@llvm/pr-subscribers-lldb

Author: None (dlav-sc)

Changes

I have encountered with the issue that sometimes lldb-server can't remove internal software breakpoints in a multithread process and as a result the process freezes.

The source of the issue was that lldb-server tried to read/write memory of the process using a tid of the exited thread and received 'No such process' error from ptrace.

This patch sets an existing thread as the current one for this process before software breakpoints removing.


Full diff: https://github.com/llvm/llvm-project/pull/127506.diff

1 Files Affected:

  • (modified) lldb/source/Plugins/Process/Linux/NativeProcessLinux.cpp (+1-1)
diff --git a/lldb/source/Plugins/Process/Linux/NativeProcessLinux.cpp b/lldb/source/Plugins/Process/Linux/NativeProcessLinux.cpp
index 7f2aba0e4eb2c..fe16ec73c0404 100644
--- a/lldb/source/Plugins/Process/Linux/NativeProcessLinux.cpp
+++ b/lldb/source/Plugins/Process/Linux/NativeProcessLinux.cpp
@@ -1959,6 +1959,7 @@ void NativeProcessLinux::SignalIfAllThreadsStopped() {
 
   // Clear any temporary breakpoints we used to implement software single
   // stepping.
+  SetCurrentThreadID(m_pending_notification_tid);
   for (const auto &thread_info : m_threads_stepping_with_breakpoint) {
     Status error = RemoveBreakpoint(thread_info.second);
     if (error.Fail())
@@ -1968,7 +1969,6 @@ void NativeProcessLinux::SignalIfAllThreadsStopped() {
   m_threads_stepping_with_breakpoint.clear();
 
   // Notify the delegate about the stop
-  SetCurrentThreadID(m_pending_notification_tid);
   SetState(StateType::eStateStopped, true);
   m_pending_notification_tid = LLDB_INVALID_THREAD_ID;
 }

@dlav-sc dlav-sc added the bug Indicates an unexpected problem or unintended behavior label Feb 17, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Indicates an unexpected problem or unintended behavior lldb
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants