[Lldb-commits] [lldb] r170409 - in /lldb/trunk: docs/lldb-gdb-remote.txt tools/debugserver/source/RNBRemote.cpp tools/debugserver/source/RNBRemote.h
Jason Molenda
jmolenda at apple.com
Mon Dec 17 20:39:44 PST 2012
Author: jmolenda
Date: Mon Dec 17 22:39:43 2012
New Revision: 170409
URL: http://llvm.org/viewvc/llvm-project?rev=170409&view=rev
Log:
Add a new qProcessInfo packet to debugserver.
This can be used by lldb to ask for information
about the process debugserver is attached to/launched.
Particularly useful on a 64-bit x86 Mac system which
can run 32-bit or 64-bit user-land processes.
Modified:
lldb/trunk/docs/lldb-gdb-remote.txt
lldb/trunk/tools/debugserver/source/RNBRemote.cpp
lldb/trunk/tools/debugserver/source/RNBRemote.h
Modified: lldb/trunk/docs/lldb-gdb-remote.txt
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/docs/lldb-gdb-remote.txt?rev=170409&r1=170408&r2=170409&view=diff
==============================================================================
--- lldb/trunk/docs/lldb-gdb-remote.txt (original)
+++ lldb/trunk/docs/lldb-gdb-remote.txt Mon Dec 17 22:39:43 2012
@@ -398,6 +398,37 @@
ptrsize: is a number that represents how big pointers are in bytes on the debug target
//----------------------------------------------------------------------
+// "qProcessInfo"
+//
+// BRIEF
+// Get information about the process we are currently debugging.
+//
+// PRIORITY TO IMPLEMENT
+// Medium. On systems which can launch multiple different architecture processes,
+// the qHostInfo may not disambiguate sufficiently to know what kind of
+// process is being debugged.
+// e.g. on a 64-bit x86 Mc system both 32-bit and 64-bit user processes are possible,
+// and with Mach-O univeral files, the executable file may contain both 32- and
+// 64-bit slices so it may be impossible to know until you're attached to a real
+// process to know what you're working with.
+//----------------------------------------------------------------------
+
+send packet: $qProcessInfo#00
+$pid:0x9517;parent-pid:0x9519;real-uid:0xecf;real-gid:0xb;effective-uid:0xecf;effective-gid:0xb;cputype:0x7;ptrsize:0x4;#00
+
+Key value pairs include:
+
+pid: the process id
+parent-pid: the process of the parent process (often debugserver will become the parent when attaching)
+real-uid: the real user id of the process
+real-gid: the real group id of the process
+effective-uid: the effective user id of the process
+effective-gid: the effective group id of the process
+cputype: the Mach-O CPU type of the process
+ptrsize: is a number that represents how big pointers are in bytes
+
+
+//----------------------------------------------------------------------
// "qShlibInfoAddr"
//
// BRIEF
Modified: lldb/trunk/tools/debugserver/source/RNBRemote.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/debugserver/source/RNBRemote.cpp?rev=170409&r1=170408&r2=170409&view=diff
==============================================================================
--- lldb/trunk/tools/debugserver/source/RNBRemote.cpp (original)
+++ lldb/trunk/tools/debugserver/source/RNBRemote.cpp Mon Dec 17 22:39:43 2012
@@ -173,6 +173,7 @@
t.push_back (Packet (query_vattachorwait_supported, &RNBRemote::HandlePacket_qVAttachOrWaitSupported,NULL, "qVAttachOrWaitSupported", "Replys with OK if the 'vAttachOrWait' packet is supported."));
t.push_back (Packet (query_sync_thread_state_supported, &RNBRemote::HandlePacket_qSyncThreadStateSupported,NULL, "qSyncThreadStateSupported", "Replys with OK if the 'QSyncThreadState:' packet is supported."));
t.push_back (Packet (query_host_info, &RNBRemote::HandlePacket_qHostInfo, NULL, "qHostInfo", "Replies with multiple 'key:value;' tuples appended to each other."));
+ t.push_back (Packet (query_process_info, &RNBRemote::HandlePacket_qProcessInfo, NULL, "qProcessInfo", "Replies with multiple 'key:value;' tuples appended to each other."));
// t.push_back (Packet (query_symbol_lookup, &RNBRemote::HandlePacket_UNIMPLEMENTED, NULL, "qSymbol", "Notify that host debugger is ready to do symbol lookups"));
t.push_back (Packet (start_noack_mode, &RNBRemote::HandlePacket_QStartNoAckMode , NULL, "QStartNoAckMode", "Request that " DEBUGSERVER_PROGRAM_NAME " stop acking remote protocol packets"));
t.push_back (Packet (prefix_reg_packets_with_tid, &RNBRemote::HandlePacket_QThreadSuffixSupported , NULL, "QThreadSuffixSupported", "Check if thread specifc packets (register packets 'g', 'G', 'p', and 'P') support having the thread ID appended to the end of the command"));
@@ -3777,3 +3778,81 @@
strm << "ptrsize:" << std::dec << sizeof(void *) << ';';
return SendPacket (strm.str());
}
+
+
+// Note that all numeric values returned by qProcessInfo are hex encoded,
+// including the pid and the cpu type, and are fixed with "0x" to indicate
+// this encoding.
+
+rnb_err_t
+RNBRemote::HandlePacket_qProcessInfo (const char *p)
+{
+ nub_process_t pid;
+ std::ostringstream rep;
+
+ // If we haven't run the process yet, return an error.
+ if (!m_ctx.HasValidProcessID())
+ return SendPacket ("E68");
+
+ pid = m_ctx.ProcessID();
+
+ rep << "pid:0x" << std::hex << pid << ";";
+
+ int procpid_mib[4];
+ procpid_mib[0] = CTL_KERN;
+ procpid_mib[1] = KERN_PROC;
+ procpid_mib[2] = KERN_PROC_PID;
+ procpid_mib[3] = pid;
+ struct kinfo_proc proc_kinfo;
+ size_t proc_kinfo_size = sizeof(struct kinfo_proc);
+
+ if (::sysctl (procpid_mib, 4, &proc_kinfo, &proc_kinfo_size, NULL, 0) == 0)
+ {
+ if (proc_kinfo_size > 0)
+ {
+ rep << "parent-pid:0x" << std::hex << proc_kinfo.kp_eproc.e_ppid << ";";
+ rep << "real-uid:0x" << std::hex << proc_kinfo.kp_eproc.e_pcred.p_ruid << ";";
+ rep << "real-gid:0x" << std::hex << proc_kinfo.kp_eproc.e_pcred.p_rgid << ";";
+ rep << "effective-uid:0x" << std::hex << proc_kinfo.kp_eproc.e_ucred.cr_uid << ";";
+ if (proc_kinfo.kp_eproc.e_ucred.cr_ngroups > 0)
+ rep << "effective-gid:0x" << std::hex << proc_kinfo.kp_eproc.e_ucred.cr_groups[0] << ";";
+ }
+ }
+
+ int cputype_mib[CTL_MAXNAME]={0,};
+ size_t cputype_mib_len = CTL_MAXNAME;
+ if (::sysctlnametomib("sysctl.proc_cputype", cputype_mib, &cputype_mib_len) == 0)
+ {
+ cputype_mib[cputype_mib_len] = pid;
+ cputype_mib_len++;
+ cpu_type_t cpu;
+ size_t len = sizeof(cpu);
+ if (::sysctl (cputype_mib, cputype_mib_len, &cpu, &len, 0, 0) == 0)
+ {
+ rep << "cputype:0x" << std::hex << cpu << ";";
+ }
+ }
+
+ nub_thread_t thread = DNBProcessGetCurrentThread (pid);
+
+ kern_return_t kr;
+
+#if defined (__x86_64__) || defined (__i386__)
+ x86_thread_state_t gp_regs;
+ mach_msg_type_number_t gp_count = x86_THREAD_STATE_COUNT;
+ kr = thread_get_state (thread, x86_THREAD_STATE,
+ (thread_state_t) &gp_regs, &gp_count);
+ if (kr == KERN_SUCCESS)
+ {
+ if (gp_regs.tsh.flavor == x86_THREAD_STATE64)
+ rep << "ptrsize:0x8;";
+ else
+ rep << "ptrsize:0x4;";
+ }
+#elif defined (__arm__)
+ rep << "ptrsize:0x4;";
+#endif
+
+ return SendPacket (rep.str());
+}
+
Modified: lldb/trunk/tools/debugserver/source/RNBRemote.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/debugserver/source/RNBRemote.h?rev=170409&r1=170408&r2=170409&view=diff
==============================================================================
--- lldb/trunk/tools/debugserver/source/RNBRemote.h (original)
+++ lldb/trunk/tools/debugserver/source/RNBRemote.h Mon Dec 17 22:39:43 2012
@@ -95,6 +95,7 @@
query_vattachorwait_supported, // 'qVAttachOrWaitSupported'
query_sync_thread_state_supported,// 'QSyncThreadState'
query_host_info, // 'qHostInfo'
+ query_process_info, // 'qProcessInfo'
pass_signals_to_inferior, // 'QPassSignals'
start_noack_mode, // 'QStartNoAckMode'
prefix_reg_packets_with_tid, // 'QPrefixRegisterPacketsWithThreadID
@@ -176,6 +177,7 @@
rnb_err_t HandlePacket_qThreadExtraInfo (const char *p);
rnb_err_t HandlePacket_qThreadStopInfo (const char *p);
rnb_err_t HandlePacket_qHostInfo (const char *p);
+ rnb_err_t HandlePacket_qProcessInfo (const char *p);
rnb_err_t HandlePacket_QStartNoAckMode (const char *p);
rnb_err_t HandlePacket_QThreadSuffixSupported (const char *p);
rnb_err_t HandlePacket_QSetLogging (const char *p);
More information about the lldb-commits
mailing list