https://github.com/dlav-sc created https://github.com/llvm/llvm-project/pull/127506
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. >From 8beff49a1b0af7b5f2298a73b9bb1a17670f673b Mon Sep 17 00:00:00 2001 From: Daniil Avdeev <daniil.avd...@syntacore.com> Date: Wed, 12 Feb 2025 13:15:53 +0000 Subject: [PATCH] [lldb] fix software breakpoint removing in multithreaded process while 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. --- lldb/source/Plugins/Process/Linux/NativeProcessLinux.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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; } _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits