diff options
author | Jason Molenda <jmolenda@apple.com> | 2014-06-13 02:37:02 +0000 |
---|---|---|
committer | Jason Molenda <jmolenda@apple.com> | 2014-06-13 02:37:02 +0000 |
commit | 705b1809641ba3e102d437cffff29bfe2b611cab (patch) | |
tree | d7d544a448ba355e7a363e91e2a782ccf3c01f11 /lldb/tools/debugserver/source/MacOSX/MachProcess.mm | |
parent | b4ad29be9277829737ce984494f80d2bf17cfd11 (diff) | |
download | bcm5719-llvm-705b1809641ba3e102d437cffff29bfe2b611cab.tar.gz bcm5719-llvm-705b1809641ba3e102d437cffff29bfe2b611cab.zip |
Initial merge of some of the iOS 8 / Mac OS X Yosemite specific
lldb support. I'll be doing more testing & cleanup but I wanted to
get the initial checkin done.
This adds a new SBExpressionOptions::SetLanguage API for selecting a
language of an expression.
I added adds a new SBThread::GetInfoItemByPathString for retriving
information about a thread from that thread's StructuredData.
I added a new StructuredData class for representing
key-value/array/dictionary information (e.g. JSON formatted data).
Helper functions to read JSON and create a StructuredData object,
and to print a StructuredData object in JSON format are included.
A few Cocoa / Cocoa Touch data formatters were updated by Enrico
to track changes in iOS 8 / Yosemite.
Before we query a thread's extended information, the system runtime may
provide hints to the remote debug stub that it will use to retrieve values
out of runtime structures. I added a new SystemRuntime method
AddThreadExtendedInfoPacketHints which allows the SystemRuntime to add
key-value type data to the initial request that we send to the remote stub.
The thread-format formatter string can now retrieve values out of a thread's
extended info structured data. The default thread-format string picks up
two of these - thread.info.activity.name and thread.info.trace_messages.
I added a new "jThreadExtendedInfo" packet in debugserver; I will
add documentation to the lldb-gdb-remote.txt doc soon. It accepts
JSON formatted arguments (most importantly, "thread":threadnum) and
it returns a variety of information regarding the thread to lldb
in JSON format. This JSON return is scanned into a StructuredData
object that is associated with the thread; UI layers can query the
thread's StructuredData to see if key-values are present, and if
so, show them to the user. These key-values are likely to be
specific to different targets with some commonality among many
targets. For instance, many targets will be able to advertise the
pthread_t value for a thread.
I added an initial rough cut of "thread info" command which will print
the information about a thread from the jThreadExtendedInfo result.
I need to do more work to make this format reasonably.
Han Ming added calls into the pmenergy and pmsample libraries if
debugserver is run on Mac OS X Yosemite to get information about the
inferior's power use.
I added support to debugserver for gathering the Genealogy information
about threads, if it exists, and returning it in the jThreadExtendedInfo
JSON result.
llvm-svn: 210874
Diffstat (limited to 'lldb/tools/debugserver/source/MacOSX/MachProcess.mm')
-rw-r--r-- | lldb/tools/debugserver/source/MacOSX/MachProcess.mm | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/lldb/tools/debugserver/source/MacOSX/MachProcess.mm b/lldb/tools/debugserver/source/MacOSX/MachProcess.mm index 0ac985b1cb6..85123977f0b 100644 --- a/lldb/tools/debugserver/source/MacOSX/MachProcess.mm +++ b/lldb/tools/debugserver/source/MacOSX/MachProcess.mm @@ -126,6 +126,7 @@ MachProcess::MachProcess() : m_profile_data_mutex(PTHREAD_MUTEX_RECURSIVE), m_profile_data (), m_thread_list (), + m_activities (), m_exception_messages (), m_exception_messages_mutex (PTHREAD_MUTEX_RECURSIVE), m_state (eStateUnloaded), @@ -219,6 +220,30 @@ MachProcess::SyncThreadState (nub_thread_t tid) } +ThreadInfo::QoS +MachProcess::GetRequestedQoS (nub_thread_t tid, nub_addr_t tsd, uint64_t dti_qos_class_index) +{ + return m_thread_list.GetRequestedQoS (tid, tsd, dti_qos_class_index); +} + +nub_addr_t +MachProcess::GetPThreadT (nub_thread_t tid) +{ + return m_thread_list.GetPThreadT (tid); +} + +nub_addr_t +MachProcess::GetDispatchQueueT (nub_thread_t tid) +{ + return m_thread_list.GetDispatchQueueT (tid); +} + +nub_addr_t +MachProcess::GetTSDAddressForThread (nub_thread_t tid, uint64_t plo_pthread_tsd_base_address_offset, uint64_t plo_pthread_tsd_base_offset, uint64_t plo_pthread_tsd_entry_size) +{ + return m_thread_list.GetTSDAddressForThread (tid, plo_pthread_tsd_base_address_offset, plo_pthread_tsd_base_offset, plo_pthread_tsd_entry_size); +} + nub_thread_t MachProcess::GetCurrentThread () { @@ -365,6 +390,7 @@ MachProcess::Clear(bool detaching) PTHREAD_MUTEX_LOCKER(locker, m_exception_messages_mutex); m_exception_messages.clear(); } + m_activities.Clear(); if (m_profile_thread) { pthread_join(m_profile_thread, NULL); @@ -605,6 +631,7 @@ MachProcess::Detach() { m_thread_actions.Clear(); + m_activities.Clear(); DNBThreadResumeAction thread_action; thread_action.tid = m_thread_list.ThreadIDAtIndex (thread_idx); thread_action.state = eStateRunning; @@ -1250,6 +1277,7 @@ MachProcess::ExceptionMessageBundleComplete() DNBArchProtocol::SetArchitecture (process_cpu_type); } m_thread_list.Clear(); + m_activities.Clear(); m_breakpoints.DisableAll(); } @@ -1288,6 +1316,7 @@ MachProcess::ExceptionMessageBundleComplete() // Let all threads recover from stopping and do any clean up based // on the previous thread state (if any). m_thread_list.ProcessDidStop(this); + m_activities.Clear(); // Let each thread know of any exceptions for (i=0; i<m_exception_messages.size(); ++i) @@ -1666,6 +1695,18 @@ MachProcess::AttachForDebug (pid_t pid, char *err_str, size_t err_len) return INVALID_NUB_PROCESS; } +Genealogy::ThreadActivitySP +MachProcess::GetGenealogyInfoForThread (nub_thread_t tid, bool &timed_out) +{ + return m_activities.GetGenealogyInfoForThread (m_pid, tid, m_thread_list, m_task.TaskPort(), timed_out); +} + +Genealogy::ProcessExecutableInfoSP +MachProcess::GetGenealogyImageInfo (size_t idx) +{ + return m_activities.GetProcessExecutableInfosAtIndex (idx); +} + // Do the process specific setup for attach. If this returns NULL, then there's no // platform specific stuff to be done to wait for the attach. If you get non-null, // pass that token to the CheckForProcess method, and then to CleanupAfterAttach. |