diff options
| author | Jim Ingham <jingham@apple.com> | 2018-12-07 01:18:40 +0000 |
|---|---|---|
| committer | Jim Ingham <jingham@apple.com> | 2018-12-07 01:18:40 +0000 |
| commit | 29ae65946a10436e038349d40955346a52de1632 (patch) | |
| tree | a8d45cbc60f8da9115557d0054682b201606ba2d | |
| parent | 14ca9a8355b278517db28d7ecec7004d31318aa7 (diff) | |
| download | bcm5719-llvm-29ae65946a10436e038349d40955346a52de1632.tar.gz bcm5719-llvm-29ae65946a10436e038349d40955346a52de1632.zip | |
Handle detecting exec for DynamicLoaderMacOS with older debugservers
that don't send reason:exec.
<rdar://problem/43756823>
Differential Revision: https://reviews.llvm.org/D55399
llvm-svn: 348559
| -rw-r--r-- | lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOS.cpp | 39 | ||||
| -rw-r--r-- | lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOS.h | 6 |
2 files changed, 34 insertions, 11 deletions
diff --git a/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOS.cpp b/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOS.cpp index 65a35549e7f..7fd886cdeae 100644 --- a/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOS.cpp +++ b/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOS.cpp @@ -79,7 +79,8 @@ DynamicLoader *DynamicLoaderMacOS::CreateInstance(Process *process, //---------------------------------------------------------------------- DynamicLoaderMacOS::DynamicLoaderMacOS(Process *process) : DynamicLoaderDarwin(process), m_image_infos_stop_id(UINT32_MAX), - m_break_id(LLDB_INVALID_BREAK_ID), m_mutex() {} + m_break_id(LLDB_INVALID_BREAK_ID), m_mutex(), + m_maybe_image_infos_address(LLDB_INVALID_ADDRESS) {} //---------------------------------------------------------------------- // Destructor @@ -95,16 +96,31 @@ bool DynamicLoaderMacOS::ProcessDidExec() { if (m_process) { // If we are stopped after an exec, we will have only one thread... if (m_process->GetThreadList().GetSize() == 1) { - // See if we are stopped at '_dyld_start' - ThreadSP thread_sp(m_process->GetThreadList().GetThreadAtIndex(0)); - if (thread_sp) { - lldb::StackFrameSP frame_sp(thread_sp->GetStackFrameAtIndex(0)); - if (frame_sp) { - const Symbol *symbol = - frame_sp->GetSymbolContext(eSymbolContextSymbol).symbol; - if (symbol) { - if (symbol->GetName() == ConstString("_dyld_start")) - did_exec = true; + // Maybe we still have an image infos address around? If so see + // if that has changed, and if so we have exec'ed. + if (m_maybe_image_infos_address != LLDB_INVALID_ADDRESS) { + lldb::addr_t image_infos_address = m_process->GetImageInfoAddress(); + if (image_infos_address != m_maybe_image_infos_address) { + // We don't really have to reset this here, since we are going to + // call DoInitialImageFetch right away to handle the exec. But in + // case anybody looks at it in the meantime, it can't hurt. + m_maybe_image_infos_address = image_infos_address; + did_exec = true; + } + } + + if (!did_exec) { + // See if we are stopped at '_dyld_start' + ThreadSP thread_sp(m_process->GetThreadList().GetThreadAtIndex(0)); + if (thread_sp) { + lldb::StackFrameSP frame_sp(thread_sp->GetStackFrameAtIndex(0)); + if (frame_sp) { + const Symbol *symbol = + frame_sp->GetSymbolContext(eSymbolContextSymbol).symbol; + if (symbol) { + if (symbol->GetName() == ConstString("_dyld_start")) + did_exec = true; + } } } } @@ -180,6 +196,7 @@ void DynamicLoaderMacOS::DoInitialImageFetch() { } m_dyld_image_infos_stop_id = m_process->GetStopID(); + m_maybe_image_infos_address = m_process->GetImageInfoAddress(); } bool DynamicLoaderMacOS::NeedToDoInitialImageFetch() { return true; } diff --git a/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOS.h b/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOS.h index b73647be889..6303c066511 100644 --- a/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOS.h +++ b/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOS.h @@ -104,6 +104,12 @@ protected: // loaded/unloaded images lldb::user_id_t m_break_id; mutable std::recursive_mutex m_mutex; + lldb::addr_t m_maybe_image_infos_address; // If dyld is still maintaining the + // all_image_infos address, store it + // here so we can use it to detect + // exec's when talking to + // debugservers that don't support + // the "reason:exec" annotation. private: DISALLOW_COPY_AND_ASSIGN(DynamicLoaderMacOS); |

