diff options
author | Greg Clayton <gclayton@apple.com> | 2013-04-02 20:32:37 +0000 |
---|---|---|
committer | Greg Clayton <gclayton@apple.com> | 2013-04-02 20:32:37 +0000 |
commit | 1afa68ed14ad9636dda390add3bf74e32b5c0303 (patch) | |
tree | 8db567d5296fe0d38df20e0cbe57bd7d29160eec /lldb/source/Plugins/Process/MacOSX-Kernel | |
parent | cbf87cc8d608dcb2902ae46bc63477abe3f2a835 (diff) | |
download | bcm5719-llvm-1afa68ed14ad9636dda390add3bf74e32b5c0303.tar.gz bcm5719-llvm-1afa68ed14ad9636dda390add3bf74e32b5c0303.zip |
<rdar://problem/13516463>
Don't crash when there is no register context for a thread with kernel debugging. The kernel debugging uses the OperatingSystemPlugin that may behave badly when trying to get thread state, so be prepared to have invalid register contexts in threads.
llvm-svn: 178574
Diffstat (limited to 'lldb/source/Plugins/Process/MacOSX-Kernel')
-rw-r--r-- | lldb/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp | 39 | ||||
-rw-r--r-- | lldb/source/Plugins/Process/MacOSX-Kernel/ThreadKDP.cpp | 4 |
2 files changed, 36 insertions, 7 deletions
diff --git a/lldb/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp b/lldb/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp index 339c83a3098..226f59071d2 100644 --- a/lldb/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp +++ b/lldb/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp @@ -386,13 +386,35 @@ ProcessKDP::DoResume () break; case eStateStepping: - kernel_thread_sp->GetRegisterContext()->HardwareSingleStep (true); - resume = true; + { + lldb::RegisterContextSP reg_ctx_sp (kernel_thread_sp->GetRegisterContext()); + + if (reg_ctx_sp) + { + reg_ctx_sp->HardwareSingleStep (true); + resume = true; + } + else + { + error.SetErrorStringWithFormat("KDP thread 0x%llx has no register context", kernel_thread_sp->GetID()); + } + } break; case eStateRunning: - kernel_thread_sp->GetRegisterContext()->HardwareSingleStep (false); - resume = true; + { + lldb::RegisterContextSP reg_ctx_sp (kernel_thread_sp->GetRegisterContext()); + + if (reg_ctx_sp) + { + reg_ctx_sp->HardwareSingleStep (false); + resume = true; + } + else + { + error.SetErrorStringWithFormat("KDP thread 0x%llx has no register context", kernel_thread_sp->GetID()); + } + } break; default: @@ -774,8 +796,13 @@ ProcessKDP::AsyncThread (void *arg) if (process->m_comm.WaitForPacketWithTimeoutMicroSeconds (exc_reply_packet, 1 * USEC_PER_SEC)) { ThreadSP thread_sp (process->GetKernelThread(process->GetThreadList(), process->GetThreadList())); - thread_sp->GetRegisterContext()->InvalidateAllRegisters(); - static_cast<ThreadKDP *>(thread_sp.get())->SetStopInfoFrom_KDP_EXCEPTION (exc_reply_packet); + if (thread_sp) + { + lldb::RegisterContextSP reg_ctx_sp (thread_sp->GetRegisterContext()); + if (reg_ctx_sp) + reg_ctx_sp->InvalidateAllRegisters(); + static_cast<ThreadKDP *>(thread_sp.get())->SetStopInfoFrom_KDP_EXCEPTION (exc_reply_packet); + } // TODO: parse the stop reply packet is_running = false; diff --git a/lldb/source/Plugins/Process/MacOSX-Kernel/ThreadKDP.cpp b/lldb/source/Plugins/Process/MacOSX-Kernel/ThreadKDP.cpp index 8ce90e57fde..29616430a05 100644 --- a/lldb/source/Plugins/Process/MacOSX-Kernel/ThreadKDP.cpp +++ b/lldb/source/Plugins/Process/MacOSX-Kernel/ThreadKDP.cpp @@ -95,7 +95,9 @@ ThreadKDP::RefreshStateAfterStop() // register supply functions where they check the process stop ID and do // the right thing. const bool force = false; - GetRegisterContext()->InvalidateIfNeeded (force); + lldb::RegisterContextSP reg_ctx_sp (GetRegisterContext()); + if (reg_ctx_sp) + reg_ctx_sp->InvalidateIfNeeded (force); } void |