LLDB mainline
|
Interface to the runtime linker. More...
#include <DYLDRendezvous.h>
Classes | |
struct | Rendezvous |
struct | SOEntry |
Structure representing the shared objects currently loaded into the inferior process. More... | |
struct | ThreadInfo |
Public Types | |
enum | RendezvousState { eConsistent , eAdd , eDelete } |
Constants describing the state of the rendezvous. More... | |
typedef SOEntryList::const_iterator | iterator |
Public Member Functions | |
DYLDRendezvous (lldb_private::Process *process) | |
void | UpdateExecutablePath () |
Update the cached executable path. | |
bool | Resolve () |
Update the internal snapshot of runtime linker rendezvous and recompute the currently loaded modules. | |
bool | IsValid () |
lldb::addr_t | GetRendezvousAddress () const |
uint64_t | GetVersion () const |
lldb::addr_t | GetLinkMapAddress () const |
lldb::addr_t | GetBreakAddress () const |
A breakpoint should be set at this address and Resolve called on each hit. | |
uint64_t | GetState () const |
Returns the current state of the rendezvous structure. | |
lldb::addr_t | GetLDBase () const |
const ThreadInfo & | GetThreadInfo () |
bool | ModulesDidLoad () const |
bool | ModulesDidUnload () const |
void | DumpToLog (lldb_private::Log *log) const |
iterator | begin () const |
Iterators over all currently loaded modules. | |
iterator | end () const |
iterator | loaded_begin () const |
Iterators over all modules loaded into the inferior since the last call to Resolve(). | |
iterator | loaded_end () const |
iterator | unloaded_begin () const |
Iterators over all modules unloaded from the inferior since the last call to Resolve(). | |
iterator | unloaded_end () const |
Protected Types | |
enum | PThreadField { eSize , eNElem , eOffset } |
enum | RendezvousAction { eNoAction , eTakeSnapshot , eAddModules , eRemoveModules } |
typedef std::list< SOEntry > | SOEntryList |
Protected Member Functions | |
lldb::addr_t | ReadWord (lldb::addr_t addr, uint64_t *dst, size_t size) |
Reads an unsigned integer of size bytes from the inferior's address space starting at addr . | |
lldb::addr_t | ReadPointer (lldb::addr_t addr, lldb::addr_t *dst) |
Reads an address from the inferior's address space starting at addr . | |
std::string | ReadStringFromMemory (lldb::addr_t addr) |
Reads a null-terminated C string from the memory location starting at addr . | |
bool | ReadSOEntryFromMemory (lldb::addr_t addr, SOEntry &entry) |
Reads an SOEntry starting at addr . | |
bool | UpdateSOEntries () |
Updates the current set of SOEntries, the set of added entries, and the set of removed entries. | |
bool | UpdateSOEntriesFromRemote () |
Same as UpdateSOEntries but it gets the list of loaded modules from the remote debug server (faster when supported). | |
bool | FillSOEntryFromModuleInfo (LoadedModuleInfoList::LoadedModuleInfo const &modInfo, SOEntry &entry) |
bool | SaveSOEntriesFromRemote (const LoadedModuleInfoList &module_list) |
bool | AddSOEntriesFromRemote (const LoadedModuleInfoList &module_list) |
bool | RemoveSOEntriesFromRemote (const LoadedModuleInfoList &module_list) |
bool | AddSOEntries () |
bool | RemoveSOEntries () |
void | UpdateBaseAddrIfNecessary (SOEntry &entry, std::string const &file_path) |
void | UpdateFileSpecIfNecessary (SOEntry &entry) |
bool | SOEntryIsMainExecutable (const SOEntry &entry) |
bool | TakeSnapshot (SOEntryList &entry_list) |
Reads the current list of shared objects according to the link map supplied by the runtime linker. | |
bool | FindMetadata (const char *name, PThreadField field, uint32_t &value) |
bool | IsCoreFile () const |
RendezvousAction | GetAction () const |
Returns the current action to be taken given the current and previous state. | |
Protected Attributes | |
lldb_private::Process * | m_process |
lldb_private::FileSpec | m_exe_file_spec |
lldb::addr_t | m_rendezvous_addr |
Location of the r_debug structure in the inferiors address space. | |
bool | m_executable_interpreter |
Rendezvous | m_current |
Current and previous snapshots of the rendezvous structure. | |
Rendezvous | m_previous |
LoadedModuleInfoList | m_loaded_modules |
List of currently loaded SO modules. | |
SOEntryList | m_soentries |
List of SOEntry objects corresponding to the current link map state. | |
SOEntryList | m_added_soentries |
List of SOEntry's added to the link map since the last call to Resolve(). | |
SOEntryList | m_removed_soentries |
List of SOEntry's removed from the link map since the last call to Resolve(). | |
ThreadInfo | m_thread_info |
Threading metadata read from the inferior. | |
Private Member Functions | |
lldb::addr_t | ResolveRendezvousAddress () |
Locates the address of the rendezvous structure. | |
Interface to the runtime linker.
A structure is present in a processes memory space which is updated by the runtime liker each time a module is loaded or unloaded. This class provides an interface to this structure and maintains a consistent snapshot of the currently loaded modules.
Definition at line 34 of file DYLDRendezvous.h.
typedef SOEntryList::const_iterator DYLDRendezvous::iterator |
Definition at line 167 of file DYLDRendezvous.h.
|
protected |
Definition at line 164 of file DYLDRendezvous.h.
|
protected |
Enumerator | |
---|---|
eSize | |
eNElem | |
eOffset |
Definition at line 266 of file DYLDRendezvous.h.
|
protected |
Enumerator | |
---|---|
eNoAction | |
eTakeSnapshot | |
eAddModules | |
eRemoveModules |
Definition at line 272 of file DYLDRendezvous.h.
Constants describing the state of the rendezvous.
Enumerator | |
---|---|
eConsistent | |
eAdd | |
eDelete |
Definition at line 130 of file DYLDRendezvous.h.
DYLDRendezvous::DYLDRendezvous | ( | lldb_private::Process * | process | ) |
Definition at line 28 of file DYLDRendezvous.cpp.
References m_thread_info, UpdateExecutablePath(), and DYLDRendezvous::ThreadInfo::valid.
|
protected |
Definition at line 388 of file DYLDRendezvous.cpp.
References eAdd, m_added_soentries, m_current, m_previous, m_soentries, DYLDRendezvous::Rendezvous::map_addr, DYLDRendezvous::SOEntry::next, ReadSOEntryFromMemory(), SOEntryIsMainExecutable(), DYLDRendezvous::Rendezvous::state, and UpdateFileSpecIfNecessary().
Referenced by UpdateSOEntries().
|
protected |
Definition at line 325 of file DYLDRendezvous.cpp.
References FillSOEntryFromModuleInfo(), m_added_soentries, lldb_private::LoadedModuleInfoList::m_list, m_loaded_modules, m_soentries, SOEntryIsMainExecutable(), and UpdateFileSpecIfNecessary().
Referenced by UpdateSOEntriesFromRemote().
|
inline |
Iterators over all currently loaded modules.
Definition at line 170 of file DYLDRendezvous.h.
References m_soentries.
Referenced by DumpToLog(), DynamicLoaderPOSIXDYLD::LoadAllCurrentModules(), DynamicLoaderPOSIXDYLD::RefreshModules(), and RemoveSOEntries().
void DYLDRendezvous::DumpToLog | ( | lldb_private::Log * | log | ) | const |
Definition at line 642 of file DYLDRendezvous.cpp.
References begin(), eAdd, eConsistent, eDelete, end(), GetBreakAddress(), GetLDBase(), GetLinkMapAddress(), GetRendezvousAddress(), GetState(), GetVersion(), LLDB_LOGF, and lldb_private::Log::PutCString().
|
inline |
Definition at line 171 of file DYLDRendezvous.h.
References m_soentries.
Referenced by DumpToLog(), DynamicLoaderPOSIXDYLD::LoadAllCurrentModules(), DynamicLoaderPOSIXDYLD::RefreshModules(), and RemoveSOEntries().
|
protected |
Definition at line 280 of file DYLDRendezvous.cpp.
References DYLDRendezvous::SOEntry::base_addr, DYLDRendezvous::SOEntry::dyn_addr, DYLDRendezvous::SOEntry::file_spec, lldb_private::LoadedModuleInfoList::LoadedModuleInfo::get_base(), lldb_private::LoadedModuleInfoList::LoadedModuleInfo::get_dynamic(), lldb_private::LoadedModuleInfoList::LoadedModuleInfo::get_link_map(), lldb_private::LoadedModuleInfoList::LoadedModuleInfo::get_name(), DYLDRendezvous::SOEntry::link_addr, DYLDRendezvous::SOEntry::next, DYLDRendezvous::SOEntry::path_addr, DYLDRendezvous::SOEntry::prev, lldb_private::FileSpec::SetFile(), and UpdateBaseAddrIfNecessary().
Referenced by AddSOEntriesFromRemote(), RemoveSOEntriesFromRemote(), and SaveSOEntriesFromRemote().
|
protected |
Definition at line 595 of file DYLDRendezvous.cpp.
References error(), eSize, lldb::eSymbolTypeAny, lldb_private::ModuleList::FindSymbolsWithNameAndType(), lldb_private::Target::GetImages(), lldb_private::Address::GetLoadAddress(), lldb_private::Process::GetTarget(), lldb_private::SymbolContextList::IsEmpty(), LLDB_INVALID_ADDRESS, m_process, and lldb_private::Process::ReadUnsignedIntegerFromMemory().
Referenced by GetThreadInfo().
|
protected |
Returns the current action to be taken given the current and previous state.
Definition at line 192 of file DYLDRendezvous.cpp.
References eAdd, eAddModules, eConsistent, eDelete, eNoAction, eRemoveModules, eTakeSnapshot, IsCoreFile(), m_current, m_previous, and DYLDRendezvous::Rendezvous::state.
Referenced by UpdateSOEntries(), and UpdateSOEntriesFromRemote().
|
inline |
A breakpoint should be set at this address and Resolve called on each hit.
Definition at line 105 of file DYLDRendezvous.h.
References DYLDRendezvous::Rendezvous::brk, and m_current.
Referenced by DumpToLog(), and DynamicLoaderPOSIXDYLD::SetRendezvousBreakpoint().
|
inline |
Definition at line 112 of file DYLDRendezvous.h.
References DYLDRendezvous::Rendezvous::ldbase, and m_current.
Referenced by DumpToLog().
|
inline |
Definition at line 96 of file DYLDRendezvous.h.
References m_current, and DYLDRendezvous::Rendezvous::map_addr.
Referenced by DumpToLog(), and DynamicLoaderPOSIXDYLD::LoadAllCurrentModules().
|
inline |
Definition at line 89 of file DYLDRendezvous.h.
References m_rendezvous_addr.
Referenced by DumpToLog().
|
inline |
Returns the current state of the rendezvous structure.
Definition at line 108 of file DYLDRendezvous.h.
References m_current, and DYLDRendezvous::Rendezvous::state.
Referenced by DumpToLog().
const DYLDRendezvous::ThreadInfo & DYLDRendezvous::GetThreadInfo | ( | ) |
Definition at line 622 of file DYLDRendezvous.cpp.
References DYLDRendezvous::ThreadInfo::dtv_offset, DYLDRendezvous::ThreadInfo::dtv_slot_size, eOffset, eSize, FindMetadata(), m_thread_info, DYLDRendezvous::ThreadInfo::modid_offset, DYLDRendezvous::ThreadInfo::tls_offset, and DYLDRendezvous::ThreadInfo::valid.
Referenced by DynamicLoaderPOSIXDYLD::GetThreadLocalData().
|
inline |
Definition at line 92 of file DYLDRendezvous.h.
References m_current, and DYLDRendezvous::Rendezvous::version.
Referenced by DumpToLog().
|
protected |
Definition at line 676 of file DYLDRendezvous.cpp.
References lldb_private::Process::IsLiveDebugSession(), and m_process.
Referenced by GetAction().
bool DYLDRendezvous::IsValid | ( | ) |
Definition at line 188 of file DYLDRendezvous.cpp.
References LLDB_INVALID_ADDRESS, and m_rendezvous_addr.
Referenced by DynamicLoaderPOSIXDYLD::SetRendezvousBreakpoint().
|
inline |
Iterators over all modules loaded into the inferior since the last call to Resolve().
Definition at line 175 of file DYLDRendezvous.h.
References m_added_soentries.
Referenced by DynamicLoaderPOSIXDYLD::RefreshModules().
|
inline |
Definition at line 176 of file DYLDRendezvous.h.
References m_added_soentries.
Referenced by DynamicLoaderPOSIXDYLD::RefreshModules().
|
inline |
Definition at line 119 of file DYLDRendezvous.h.
References m_added_soentries.
Referenced by DynamicLoaderPOSIXDYLD::RefreshModules().
|
inline |
Definition at line 123 of file DYLDRendezvous.h.
References m_removed_soentries.
Referenced by DynamicLoaderPOSIXDYLD::RefreshModules().
|
protected |
Reads an address from the inferior's address space starting at addr
.
Definition at line 491 of file DYLDRendezvous.cpp.
References error(), lldb_private::Process::GetAddressByteSize(), m_process, and lldb_private::Process::ReadPointerFromMemory().
Referenced by ReadSOEntryFromMemory(), and Resolve().
|
protected |
Reads an SOEntry starting at addr
.
Definition at line 553 of file DYLDRendezvous.cpp.
References DYLDRendezvous::SOEntry::base_addr, DYLDRendezvous::SOEntry::clear(), DYLDRendezvous::SOEntry::dyn_addr, DYLDRendezvous::SOEntry::file_spec, lldb_private::Target::GetArchitecture(), lldb_private::Process::GetTarget(), lldb_private::ArchSpec::GetTriple(), lldb_private::ArchSpec::IsMIPS(), DYLDRendezvous::SOEntry::link_addr, m_process, DYLDRendezvous::SOEntry::next, DYLDRendezvous::SOEntry::path_addr, DYLDRendezvous::SOEntry::prev, ReadPointer(), ReadStringFromMemory(), lldb_private::FileSpec::SetFile(), and UpdateBaseAddrIfNecessary().
Referenced by AddSOEntries(), and TakeSnapshot().
|
protected |
Reads a null-terminated C string from the memory location starting at addr
.
Definition at line 501 of file DYLDRendezvous.cpp.
References error(), LLDB_INVALID_ADDRESS, m_process, and lldb_private::Process::ReadCStringFromMemory().
Referenced by ReadSOEntryFromMemory().
|
protected |
Reads an unsigned integer of size
bytes from the inferior's address space starting at addr
.
Definition at line 481 of file DYLDRendezvous.cpp.
References error(), m_process, and lldb_private::Process::ReadUnsignedIntegerFromMemory().
Referenced by Resolve().
|
protected |
Definition at line 416 of file DYLDRendezvous.cpp.
References begin(), eDelete, end(), m_previous, m_removed_soentries, m_soentries, DYLDRendezvous::Rendezvous::state, and TakeSnapshot().
Referenced by UpdateSOEntries().
|
protected |
Definition at line 355 of file DYLDRendezvous.cpp.
References FillSOEntryFromModuleInfo(), lldb_private::LoadedModuleInfoList::m_list, m_loaded_modules, m_removed_soentries, m_soentries, and SOEntryIsMainExecutable().
Referenced by UpdateSOEntriesFromRemote().
bool DYLDRendezvous::Resolve | ( | ) |
Update the internal snapshot of runtime linker rendezvous and recompute the currently loaded modules.
This method should be called once one start up, then once each time the runtime linker enters the function given by GetBreakAddress().
Definition at line 132 of file DYLDRendezvous.cpp.
References DYLDRendezvous::Rendezvous::brk, lldb_private::Process::GetAddressByteSize(), lldb_private::GetLog(), DYLDRendezvous::Rendezvous::ldbase, LLDB_INVALID_ADDRESS, LLDB_LOGF, m_current, m_previous, m_process, m_rendezvous_addr, DYLDRendezvous::Rendezvous::map_addr, ReadPointer(), ReadWord(), ResolveRendezvousAddress(), DYLDRendezvous::Rendezvous::state, UpdateSOEntries(), UpdateSOEntriesFromRemote(), DYLDRendezvous::Rendezvous::version, and word_size.
Referenced by DynamicLoaderPOSIXDYLD::LoadAllCurrentModules(), and DynamicLoaderPOSIXDYLD::RefreshModules().
|
private |
Locates the address of the rendezvous structure.
It updates m_executable_interpreter if address is extracted from _r_debug.
Definition at line 37 of file DYLDRendezvous.cpp.
References error(), lldb_private::Symbol::GetAddress(), lldb_private::Process::GetAddressByteSize(), lldb_private::Target::GetExecutableModule(), lldb_private::Process::GetImageInfoAddress(), lldb_private::ObjectFile::GetImageInfoAddress(), lldb_private::Address::GetLoadAddress(), lldb_private::GetLog(), lldb_private::Process::GetTarget(), lldb_private::Address::IsValid(), LLDB_INVALID_ADDRESS, LLDB_LOGF, m_executable_interpreter, m_process, and lldb_private::Process::ReadPointerFromMemory().
Referenced by Resolve().
|
protected |
Definition at line 307 of file DYLDRendezvous.cpp.
References FillSOEntryFromModuleInfo(), lldb_private::LoadedModuleInfoList::m_list, m_loaded_modules, m_soentries, SOEntryIsMainExecutable(), and UpdateFileSpecIfNecessary().
Referenced by UpdateSOEntriesFromRemote().
|
protected |
Definition at line 434 of file DYLDRendezvous.cpp.
References DYLDRendezvous::SOEntry::file_spec, lldb_private::Target::GetArchitecture(), lldb_private::Process::GetTarget(), lldb_private::ArchSpec::GetTriple(), m_exe_file_spec, m_executable_interpreter, and m_process.
Referenced by AddSOEntries(), AddSOEntriesFromRemote(), RemoveSOEntriesFromRemote(), SaveSOEntriesFromRemote(), and TakeSnapshot().
|
protected |
Reads the current list of shared objects according to the link map supplied by the runtime linker.
Definition at line 456 of file DYLDRendezvous.cpp.
References DYLDRendezvous::SOEntry::clear(), m_current, DYLDRendezvous::Rendezvous::map_addr, DYLDRendezvous::SOEntry::next, ReadSOEntryFromMemory(), SOEntryIsMainExecutable(), and UpdateFileSpecIfNecessary().
Referenced by RemoveSOEntries(), and UpdateSOEntries().
|
inline |
Iterators over all modules unloaded from the inferior since the last call to Resolve().
Definition at line 180 of file DYLDRendezvous.h.
References m_removed_soentries.
Referenced by DynamicLoaderPOSIXDYLD::RefreshModules().
|
inline |
Definition at line 181 of file DYLDRendezvous.h.
References m_removed_soentries.
Referenced by DynamicLoaderPOSIXDYLD::RefreshModules().
|
protected |
Definition at line 526 of file DYLDRendezvous.cpp.
References DYLDRendezvous::SOEntry::base_addr, error(), DYLDRendezvous::SOEntry::file_spec, lldb_private::Process::GetFileLoadAddress(), lldb_private::Process::GetTarget(), isLoadBiasIncorrect(), LLDB_INVALID_ADDRESS, and m_process.
Referenced by FillSOEntryFromModuleInfo(), and ReadSOEntryFromMemory().
void DYLDRendezvous::UpdateExecutablePath | ( | ) |
Update the cached executable path.
Definition at line 115 of file DYLDRendezvous.cpp.
References lldb_private::Target::GetExecutableModulePointer(), lldb_private::GetLog(), lldb_private::FileSpec::GetPath(), lldb_private::Module::GetPlatformFileSpec(), lldb_private::Process::GetTarget(), LLDB_LOGF, m_exe_file_spec, and m_process.
Referenced by DynamicLoaderPOSIXDYLD::DidAttach(), and DYLDRendezvous().
|
protected |
Definition at line 540 of file DYLDRendezvous.cpp.
References lldb_private::ConstString::AsCString(), DYLDRendezvous::SOEntry::dyn_addr, DYLDRendezvous::SOEntry::file_spec, lldb_private::Process::GetMemoryRegionInfo(), lldb_private::MemoryRegionInfo::GetName(), lldb_private::ConstString::IsEmpty(), m_process, and lldb_private::FileSpec::SetFile().
Referenced by AddSOEntries(), AddSOEntriesFromRemote(), SaveSOEntriesFromRemote(), and TakeSnapshot().
|
protected |
Updates the current set of SOEntries, the set of added entries, and the set of removed entries.
Definition at line 263 of file DYLDRendezvous.cpp.
References AddSOEntries(), eAddModules, eNoAction, eRemoveModules, eTakeSnapshot, GetAction(), m_added_soentries, m_removed_soentries, m_soentries, RemoveSOEntries(), and TakeSnapshot().
Referenced by Resolve().
|
protected |
Same as UpdateSOEntries but it gets the list of loaded modules from the remote debug server (faster when supported).
Definition at line 227 of file DYLDRendezvous.cpp.
References AddSOEntriesFromRemote(), eAddModules, eNoAction, eRemoveModules, eTakeSnapshot, GetAction(), lldb_private::Process::GetLoadedModuleList(), m_added_soentries, lldb_private::LoadedModuleInfoList::m_list, m_loaded_modules, m_process, m_removed_soentries, m_soentries, RemoveSOEntriesFromRemote(), and SaveSOEntriesFromRemote().
Referenced by Resolve().
|
protected |
List of SOEntry's added to the link map since the last call to Resolve().
Definition at line 207 of file DYLDRendezvous.h.
Referenced by AddSOEntries(), AddSOEntriesFromRemote(), loaded_begin(), loaded_end(), ModulesDidLoad(), UpdateSOEntries(), and UpdateSOEntriesFromRemote().
|
protected |
Current and previous snapshots of the rendezvous structure.
Definition at line 196 of file DYLDRendezvous.h.
Referenced by AddSOEntries(), GetAction(), GetBreakAddress(), GetLDBase(), GetLinkMapAddress(), GetState(), GetVersion(), Resolve(), and TakeSnapshot().
|
protected |
Definition at line 187 of file DYLDRendezvous.h.
Referenced by SOEntryIsMainExecutable(), and UpdateExecutablePath().
|
protected |
Definition at line 193 of file DYLDRendezvous.h.
Referenced by ResolveRendezvousAddress(), and SOEntryIsMainExecutable().
|
protected |
List of currently loaded SO modules.
Definition at line 200 of file DYLDRendezvous.h.
Referenced by AddSOEntriesFromRemote(), RemoveSOEntriesFromRemote(), SaveSOEntriesFromRemote(), and UpdateSOEntriesFromRemote().
|
protected |
Definition at line 197 of file DYLDRendezvous.h.
Referenced by AddSOEntries(), GetAction(), RemoveSOEntries(), and Resolve().
|
protected |
Definition at line 184 of file DYLDRendezvous.h.
Referenced by FindMetadata(), IsCoreFile(), ReadPointer(), ReadSOEntryFromMemory(), ReadStringFromMemory(), ReadWord(), Resolve(), ResolveRendezvousAddress(), SOEntryIsMainExecutable(), UpdateBaseAddrIfNecessary(), UpdateExecutablePath(), UpdateFileSpecIfNecessary(), and UpdateSOEntriesFromRemote().
|
protected |
List of SOEntry's removed from the link map since the last call to Resolve().
Definition at line 211 of file DYLDRendezvous.h.
Referenced by ModulesDidUnload(), RemoveSOEntries(), RemoveSOEntriesFromRemote(), unloaded_begin(), unloaded_end(), UpdateSOEntries(), and UpdateSOEntriesFromRemote().
|
protected |
Location of the r_debug structure in the inferiors address space.
Definition at line 190 of file DYLDRendezvous.h.
Referenced by GetRendezvousAddress(), IsValid(), and Resolve().
|
protected |
List of SOEntry objects corresponding to the current link map state.
Definition at line 203 of file DYLDRendezvous.h.
Referenced by AddSOEntries(), AddSOEntriesFromRemote(), begin(), end(), RemoveSOEntries(), RemoveSOEntriesFromRemote(), SaveSOEntriesFromRemote(), UpdateSOEntries(), and UpdateSOEntriesFromRemote().
|
protected |
Threading metadata read from the inferior.
Definition at line 214 of file DYLDRendezvous.h.
Referenced by DYLDRendezvous(), and GetThreadInfo().