diff options
| author | Caroline Tice <ctice@apple.com> | 2010-11-02 16:16:53 +0000 |
|---|---|---|
| committer | Caroline Tice <ctice@apple.com> | 2010-11-02 16:16:53 +0000 |
| commit | 5d7be2e6179b165f99ad1d6853b48be9ac5883ba (patch) | |
| tree | 000df268fec213720bb0cde323ac659bfd2941de | |
| parent | 321ab7a1c8fcde0e2a115b0499b6f37eaad0314e (diff) | |
| download | bcm5719-llvm-5d7be2e6179b165f99ad1d6853b48be9ac5883ba.tar.gz bcm5719-llvm-5d7be2e6179b165f99ad1d6853b48be9ac5883ba.zip | |
Fix problem where "process detach" was not working properly. The
ptrace thread update that was replying to the SIGSTOP was also causing the
process to not really be sigstop'd any more so then the call to ptrace
detach was failing, and when debugserver exited the attached process
was being killed. Now the ptrace thread update does not disturb the sigstop
state of the thread, so the detach works properly.
llvm-svn: 118018
| -rw-r--r-- | lldb/source/Commands/CommandObjectProcess.cpp | 1 | ||||
| -rw-r--r-- | lldb/tools/debugserver/source/MacOSX/MachProcess.cpp | 33 | ||||
| -rw-r--r-- | lldb/tools/debugserver/source/MacOSX/MachProcess.h | 2 |
3 files changed, 27 insertions, 9 deletions
diff --git a/lldb/source/Commands/CommandObjectProcess.cpp b/lldb/source/Commands/CommandObjectProcess.cpp index 5a54c3dc0fb..8c4ffdd96bb 100644 --- a/lldb/source/Commands/CommandObjectProcess.cpp +++ b/lldb/source/Commands/CommandObjectProcess.cpp @@ -836,6 +836,7 @@ public: return false; } + result.AppendMessageWithFormat ("Detaching from process %i\n", process->GetID()); Error error (process->Detach()); if (error.Success()) { diff --git a/lldb/tools/debugserver/source/MacOSX/MachProcess.cpp b/lldb/tools/debugserver/source/MacOSX/MachProcess.cpp index a9d522e142e..ad7af1d91c4 100644 --- a/lldb/tools/debugserver/source/MacOSX/MachProcess.cpp +++ b/lldb/tools/debugserver/source/MacOSX/MachProcess.cpp @@ -359,7 +359,7 @@ MachProcess::Signal (int signal, const struct timespec *timeout_abstime) } nub_state_t -MachProcess::DoSIGSTOP (bool clear_bps_and_wps) +MachProcess::DoSIGSTOP (bool clear_bps_and_wps, uint32_t *thread_idx_ptr) { nub_state_t state = GetState(); DNBLogThreadedIf(LOG_PROCESS, "MachProcess::DoSIGSTOP() state = %s", DNBStateAsString (state)); @@ -375,7 +375,10 @@ MachProcess::DoSIGSTOP (bool clear_bps_and_wps) // If we already have a thread stopped due to a SIGSTOP, we don't have // to do anything... - if (m_thread_list.GetThreadIndexForThreadStoppedWithSignal (SIGSTOP) != UINT32_MAX) + uint32_t thread_idx = m_thread_list.GetThreadIndexForThreadStoppedWithSignal (SIGSTOP); + if (thread_idx_ptr) + *thread_idx_ptr = thread_idx; + if (thread_idx != UINT32_MAX) return GetState(); // No threads were stopped with a SIGSTOP, we need to run and halt the @@ -401,6 +404,9 @@ MachProcess::DoSIGSTOP (bool clear_bps_and_wps) DisableAllWatchpoints (true); clear_bps_and_wps = false; } + uint32_t thread_idx = m_thread_list.GetThreadIndexForThreadStoppedWithSignal (SIGSTOP); + if (thread_idx_ptr) + *thread_idx_ptr = thread_idx; return GetState(); } @@ -409,11 +415,22 @@ MachProcess::Detach() { DNBLogThreadedIf(LOG_PROCESS, "MachProcess::Detach()"); - nub_state_t state = DoSIGSTOP(true); + uint32_t thread_idx = UINT32_MAX; + nub_state_t state = DoSIGSTOP(true, &thread_idx); DNBLogThreadedIf(LOG_PROCESS, "MachProcess::Detach() DoSIGSTOP() returned %s", DNBStateAsString(state)); { - DNBThreadResumeActions thread_actions (eStateRunning, 0); + DNBThreadResumeActions thread_actions; + DNBThreadResumeAction thread_action; + thread_action.tid = m_thread_list.ThreadIDAtIndex (thread_idx); + thread_action.state = eStateRunning; + thread_action.signal = -1; + thread_action.addr = INVALID_NUB_ADDRESS; + + thread_actions.Append (thread_action); + + thread_actions.SetDefaultThreadActionIfNeeded (eStateRunning, 0); + PTHREAD_MUTEX_LOCKER (locker, m_exception_messages_mutex); ReplyToAllExceptions (thread_actions); @@ -425,9 +442,9 @@ MachProcess::Detach() // Detach from our process errno = 0; nub_process_t pid = m_pid; - ::ptrace (PT_DETACH, pid, (caddr_t)1, 0); + int ret = ::ptrace (PT_DETACH, pid, (caddr_t)1, 0); DNBError err(errno, DNBError::POSIX); - if (DNBLogCheckLogBit(LOG_PROCESS) || err.Fail()) + if (DNBLogCheckLogBit(LOG_PROCESS) || err.Fail() || (ret != 0)) err.LogThreaded("::ptrace (PT_DETACH, %u, (caddr_t)1, 0)", pid); // Resume our task @@ -1546,7 +1563,7 @@ MachProcess::LaunchForDebug SetState (eStateAttaching); errno = 0; - int err = ptrace (PT_ATTACHEXC, m_pid, 0, 0); + int err = ::ptrace (PT_ATTACHEXC, m_pid, 0, 0); if (err == 0) { m_flags |= eMachProcessFlagsAttached; @@ -1802,7 +1819,7 @@ MachProcess::SBLaunchForDebug (const char *path, char const *argv[], char const StartSTDIOThread(); SetState (eStateAttaching); - int err = ptrace (PT_ATTACHEXC, m_pid, 0, 0); + int err = ::ptrace (PT_ATTACHEXC, m_pid, 0, 0); if (err == 0) { m_flags |= eMachProcessFlagsAttached; diff --git a/lldb/tools/debugserver/source/MacOSX/MachProcess.h b/lldb/tools/debugserver/source/MacOSX/MachProcess.h index 69961b2c09f..fa0979d7e20 100644 --- a/lldb/tools/debugserver/source/MacOSX/MachProcess.h +++ b/lldb/tools/debugserver/source/MacOSX/MachProcess.h @@ -224,7 +224,7 @@ private: nub_size_t RemoveTrapsFromBuffer (nub_addr_t addr, nub_size_t size, uint8_t *buf) const; uint32_t Flags () const { return m_flags; } - nub_state_t DoSIGSTOP (bool clear_bps_and_wps); + nub_state_t DoSIGSTOP (bool clear_bps_and_wps, uint32_t *thread_idx_ptr = NULL); pid_t m_pid; // Process ID of child process int m_child_stdin; |

