1 //===-- RNBRemote.cpp -------------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // Created by Greg Clayton on 12/12/07. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "RNBRemote.h" 15 16 #include <errno.h> 17 #include <unistd.h> 18 #include <signal.h> 19 #include <mach/exception_types.h> 20 #include <sys/stat.h> 21 #include <sys/sysctl.h> 22 23 #if defined (__APPLE__) 24 #include <pthread.h> 25 #include <sched.h> 26 #endif 27 28 #include "DNB.h" 29 #include "DNBDataRef.h" 30 #include "DNBLog.h" 31 #include "DNBThreadResumeActions.h" 32 #include "JSONGenerator.h" 33 #include "RNBContext.h" 34 #include "RNBServices.h" 35 #include "RNBSocket.h" 36 #include "lldb/Utility/StringExtractor.h" 37 #include "MacOSX/Genealogy.h" 38 #include "JSONGenerator.h" 39 40 #if defined (HAVE_LIBCOMPRESSION) 41 #include <compression.h> 42 #endif 43 44 #if defined (HAVE_LIBZ) 45 #include <zlib.h> 46 #endif 47 48 #include <iomanip> 49 #include <sstream> 50 #include <unordered_set> 51 #include <TargetConditionals.h> // for endianness predefines 52 53 //---------------------------------------------------------------------- 54 // std::iostream formatting macros 55 //---------------------------------------------------------------------- 56 #define RAW_HEXBASE std::setfill('0') << std::hex << std::right 57 #define HEXBASE '0' << 'x' << RAW_HEXBASE 58 #define RAWHEX8(x) RAW_HEXBASE << std::setw(2) << ((uint32_t)((uint8_t)x)) 59 #define RAWHEX16 RAW_HEXBASE << std::setw(4) 60 #define RAWHEX32 RAW_HEXBASE << std::setw(8) 61 #define RAWHEX64 RAW_HEXBASE << std::setw(16) 62 #define HEX8(x) HEXBASE << std::setw(2) << ((uint32_t)(x)) 63 #define HEX16 HEXBASE << std::setw(4) 64 #define HEX32 HEXBASE << std::setw(8) 65 #define HEX64 HEXBASE << std::setw(16) 66 #define RAW_HEX(x) RAW_HEXBASE << std::setw(sizeof(x)*2) << (x) 67 #define HEX(x) HEXBASE << std::setw(sizeof(x)*2) << (x) 68 #define RAWHEX_SIZE(x, sz) RAW_HEXBASE << std::setw((sz)) << (x) 69 #define HEX_SIZE(x, sz) HEXBASE << std::setw((sz)) << (x) 70 #define STRING_WIDTH(w) std::setfill(' ') << std::setw(w) 71 #define LEFT_STRING_WIDTH(s, w) std::left << std::setfill(' ') << std::setw(w) << (s) << std::right 72 #define DECIMAL std::dec << std::setfill(' ') 73 #define DECIMAL_WIDTH(w) DECIMAL << std::setw(w) 74 #define FLOAT(n, d) std::setfill(' ') << std::setw((n)+(d)+1) << std::setprecision(d) << std::showpoint << std::fixed 75 #define INDENT_WITH_SPACES(iword_idx) std::setfill(' ') << std::setw((iword_idx)) << "" 76 #define INDENT_WITH_TABS(iword_idx) std::setfill('\t') << std::setw((iword_idx)) << "" 77 // Class to handle communications via gdb remote protocol. 78 79 80 //---------------------------------------------------------------------- 81 // Decode a single hex character and return the hex value as a number or 82 // -1 if "ch" is not a hex character. 83 //---------------------------------------------------------------------- 84 static inline int 85 xdigit_to_sint (char ch) 86 { 87 if (ch >= 'a' && ch <= 'f') 88 return 10 + ch - 'a'; 89 if (ch >= 'A' && ch <= 'F') 90 return 10 + ch - 'A'; 91 if (ch >= '0' && ch <= '9') 92 return ch - '0'; 93 return -1; 94 } 95 96 //---------------------------------------------------------------------- 97 // Decode a single hex ASCII byte. Return -1 on failure, a value 0-255 98 // on success. 99 //---------------------------------------------------------------------- 100 static inline int 101 decoded_hex_ascii_char(const char *p) 102 { 103 const int hi_nibble = xdigit_to_sint(p[0]); 104 if (hi_nibble == -1) 105 return -1; 106 const int lo_nibble = xdigit_to_sint(p[1]); 107 if (lo_nibble == -1) 108 return -1; 109 return (uint8_t)((hi_nibble << 4) + lo_nibble); 110 } 111 112 //---------------------------------------------------------------------- 113 // Decode a hex ASCII string back into a string 114 //---------------------------------------------------------------------- 115 static std::string 116 decode_hex_ascii_string(const char *p, uint32_t max_length = UINT32_MAX) 117 { 118 std::string arg; 119 if (p) 120 { 121 for (const char *c = p; ((c - p)/2) < max_length; c += 2) 122 { 123 int ch = decoded_hex_ascii_char(c); 124 if (ch == -1) 125 break; 126 else 127 arg.push_back(ch); 128 } 129 } 130 return arg; 131 } 132 133 uint64_t 134 decode_uint64 (const char *p, int base, char **end = nullptr, uint64_t fail_value = 0) 135 { 136 nub_addr_t addr = strtoull (p, end, 16); 137 if (addr == 0 && errno != 0) 138 return fail_value; 139 return addr; 140 } 141 142 extern void ASLLogCallback(void *baton, uint32_t flags, const char *format, va_list args); 143 144 #if defined (__APPLE__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 101000) 145 // from System.framework/Versions/B/PrivateHeaders/sys/codesign.h 146 extern "C" { 147 #define CS_OPS_STATUS 0 /* return status */ 148 #define CS_RESTRICT 0x0000800 /* tell dyld to treat restricted */ 149 int csops(pid_t pid, unsigned int ops, void * useraddr, size_t usersize); 150 151 // from rootless.h 152 bool rootless_allows_task_for_pid (pid_t pid); 153 154 // from sys/csr.h 155 typedef uint32_t csr_config_t; 156 #define CSR_ALLOW_TASK_FOR_PID (1 << 2) 157 int csr_check(csr_config_t mask); 158 } 159 #endif 160 161 RNBRemote::RNBRemote () : 162 m_ctx (), 163 m_comm (), 164 m_arch (), 165 m_continue_thread(-1), 166 m_thread(-1), 167 m_mutex(), 168 m_dispatch_queue_offsets (), 169 m_dispatch_queue_offsets_addr (INVALID_NUB_ADDRESS), 170 m_qSymbol_index (UINT32_MAX), 171 m_packets_recvd(0), 172 m_packets(), 173 m_rx_packets(), 174 m_rx_partial_data(), 175 m_rx_pthread(0), 176 m_max_payload_size(DEFAULT_GDB_REMOTE_PROTOCOL_BUFSIZE - 4), 177 m_extended_mode(false), 178 m_noack_mode(false), 179 m_thread_suffix_supported (false), 180 m_list_threads_in_stop_reply (false), 181 m_compression_minsize (384), 182 m_enable_compression_next_send_packet (false), 183 m_compression_mode (compression_types::none) 184 { 185 DNBLogThreadedIf (LOG_RNB_REMOTE, "%s", __PRETTY_FUNCTION__); 186 CreatePacketTable (); 187 } 188 189 190 RNBRemote::~RNBRemote() 191 { 192 DNBLogThreadedIf (LOG_RNB_REMOTE, "%s", __PRETTY_FUNCTION__); 193 StopReadRemoteDataThread(); 194 } 195 196 void 197 RNBRemote::CreatePacketTable () 198 { 199 // Step required to add new packets: 200 // 1 - Add new enumeration to RNBRemote::PacketEnum 201 // 2 - Create the RNBRemote::HandlePacket_ function if a new function is needed 202 // 3 - Register the Packet definition with any needed callbacks in this function 203 // - If no response is needed for a command, then use NULL for the normal callback 204 // - If the packet is not supported while the target is running, use NULL for the async callback 205 // 4 - If the packet is a standard packet (starts with a '$' character 206 // followed by the payload and then '#' and checksum, then you are done 207 // else go on to step 5 208 // 5 - if the packet is a fixed length packet: 209 // - modify the switch statement for the first character in the payload 210 // in RNBRemote::CommDataReceived so it doesn't reject the new packet 211 // type as invalid 212 // - modify the switch statement for the first character in the payload 213 // in RNBRemote::GetPacketPayload and make sure the payload of the packet 214 // is returned correctly 215 216 std::vector <Packet> &t = m_packets; 217 t.push_back (Packet (ack, NULL, NULL, "+", "ACK")); 218 t.push_back (Packet (nack, NULL, NULL, "-", "!ACK")); 219 t.push_back (Packet (read_memory, &RNBRemote::HandlePacket_m, NULL, "m", "Read memory")); 220 t.push_back (Packet (read_register, &RNBRemote::HandlePacket_p, NULL, "p", "Read one register")); 221 t.push_back (Packet (read_general_regs, &RNBRemote::HandlePacket_g, NULL, "g", "Read registers")); 222 t.push_back (Packet (write_memory, &RNBRemote::HandlePacket_M, NULL, "M", "Write memory")); 223 t.push_back (Packet (write_register, &RNBRemote::HandlePacket_P, NULL, "P", "Write one register")); 224 t.push_back (Packet (write_general_regs, &RNBRemote::HandlePacket_G, NULL, "G", "Write registers")); 225 t.push_back (Packet (insert_mem_bp, &RNBRemote::HandlePacket_z, NULL, "Z0", "Insert memory breakpoint")); 226 t.push_back (Packet (remove_mem_bp, &RNBRemote::HandlePacket_z, NULL, "z0", "Remove memory breakpoint")); 227 t.push_back (Packet (single_step, &RNBRemote::HandlePacket_s, NULL, "s", "Single step")); 228 t.push_back (Packet (cont, &RNBRemote::HandlePacket_c, NULL, "c", "continue")); 229 t.push_back (Packet (single_step_with_sig, &RNBRemote::HandlePacket_S, NULL, "S", "Single step with signal")); 230 t.push_back (Packet (set_thread, &RNBRemote::HandlePacket_H, NULL, "H", "Set thread")); 231 t.push_back (Packet (halt, &RNBRemote::HandlePacket_last_signal, &RNBRemote::HandlePacket_stop_process, "\x03", "^C")); 232 // t.push_back (Packet (use_extended_mode, &RNBRemote::HandlePacket_UNIMPLEMENTED, NULL, "!", "Use extended mode")); 233 t.push_back (Packet (why_halted, &RNBRemote::HandlePacket_last_signal, NULL, "?", "Why did target halt")); 234 t.push_back (Packet (set_argv, &RNBRemote::HandlePacket_A, NULL, "A", "Set argv")); 235 // t.push_back (Packet (set_bp, &RNBRemote::HandlePacket_UNIMPLEMENTED, NULL, "B", "Set/clear breakpoint")); 236 t.push_back (Packet (continue_with_sig, &RNBRemote::HandlePacket_C, NULL, "C", "Continue with signal")); 237 t.push_back (Packet (detach, &RNBRemote::HandlePacket_D, NULL, "D", "Detach gdb from remote system")); 238 // t.push_back (Packet (step_inferior_one_cycle, &RNBRemote::HandlePacket_UNIMPLEMENTED, NULL, "i", "Step inferior by one clock cycle")); 239 // t.push_back (Packet (signal_and_step_inf_one_cycle, &RNBRemote::HandlePacket_UNIMPLEMENTED, NULL, "I", "Signal inferior, then step one clock cyle")); 240 t.push_back (Packet (kill, &RNBRemote::HandlePacket_k, NULL, "k", "Kill")); 241 // t.push_back (Packet (restart, &RNBRemote::HandlePacket_UNIMPLEMENTED, NULL, "R", "Restart inferior")); 242 // t.push_back (Packet (search_mem_backwards, &RNBRemote::HandlePacket_UNIMPLEMENTED, NULL, "t", "Search memory backwards")); 243 t.push_back (Packet (thread_alive_p, &RNBRemote::HandlePacket_T, NULL, "T", "Is thread alive")); 244 t.push_back (Packet (query_supported_features, &RNBRemote::HandlePacket_qSupported, NULL, "qSupported", "Query about supported features")); 245 t.push_back (Packet (vattach, &RNBRemote::HandlePacket_v, NULL, "vAttach", "Attach to a new process")); 246 t.push_back (Packet (vattachwait, &RNBRemote::HandlePacket_v, NULL, "vAttachWait", "Wait for a process to start up then attach to it")); 247 t.push_back (Packet (vattachorwait, &RNBRemote::HandlePacket_v, NULL, "vAttachOrWait", "Attach to the process or if it doesn't exist, wait for the process to start up then attach to it")); 248 t.push_back (Packet (vattachname, &RNBRemote::HandlePacket_v, NULL, "vAttachName", "Attach to an existing process by name")); 249 t.push_back (Packet (vcont_list_actions, &RNBRemote::HandlePacket_v, NULL, "vCont;", "Verbose resume with thread actions")); 250 t.push_back (Packet (vcont_list_actions, &RNBRemote::HandlePacket_v, NULL, "vCont?", "List valid continue-with-thread-actions actions")); 251 t.push_back (Packet (read_data_from_memory, &RNBRemote::HandlePacket_x, NULL, "x", "Read data from memory")); 252 t.push_back (Packet (write_data_to_memory, &RNBRemote::HandlePacket_X, NULL, "X", "Write data to memory")); 253 // t.push_back (Packet (insert_hardware_bp, &RNBRemote::HandlePacket_UNIMPLEMENTED, NULL, "Z1", "Insert hardware breakpoint")); 254 // t.push_back (Packet (remove_hardware_bp, &RNBRemote::HandlePacket_UNIMPLEMENTED, NULL, "z1", "Remove hardware breakpoint")); 255 t.push_back (Packet (insert_write_watch_bp, &RNBRemote::HandlePacket_z, NULL, "Z2", "Insert write watchpoint")); 256 t.push_back (Packet (remove_write_watch_bp, &RNBRemote::HandlePacket_z, NULL, "z2", "Remove write watchpoint")); 257 t.push_back (Packet (insert_read_watch_bp, &RNBRemote::HandlePacket_z, NULL, "Z3", "Insert read watchpoint")); 258 t.push_back (Packet (remove_read_watch_bp, &RNBRemote::HandlePacket_z, NULL, "z3", "Remove read watchpoint")); 259 t.push_back (Packet (insert_access_watch_bp, &RNBRemote::HandlePacket_z, NULL, "Z4", "Insert access watchpoint")); 260 t.push_back (Packet (remove_access_watch_bp, &RNBRemote::HandlePacket_z, NULL, "z4", "Remove access watchpoint")); 261 t.push_back (Packet (query_monitor, &RNBRemote::HandlePacket_qRcmd, NULL, "qRcmd", "Monitor command")); 262 t.push_back (Packet (query_current_thread_id, &RNBRemote::HandlePacket_qC, NULL, "qC", "Query current thread ID")); 263 t.push_back (Packet (query_echo, &RNBRemote::HandlePacket_qEcho, NULL, "qEcho:", "Echo the packet back to allow the debugger to sync up with this server")); 264 t.push_back (Packet (query_get_pid, &RNBRemote::HandlePacket_qGetPid, NULL, "qGetPid", "Query process id")); 265 t.push_back (Packet (query_thread_ids_first, &RNBRemote::HandlePacket_qThreadInfo, NULL, "qfThreadInfo", "Get list of active threads (first req)")); 266 t.push_back (Packet (query_thread_ids_subsequent, &RNBRemote::HandlePacket_qThreadInfo, NULL, "qsThreadInfo", "Get list of active threads (subsequent req)")); 267 // APPLE LOCAL: qThreadStopInfo 268 // syntax: qThreadStopInfoTTTT 269 // TTTT is hex thread ID 270 t.push_back (Packet (query_thread_stop_info, &RNBRemote::HandlePacket_qThreadStopInfo, NULL, "qThreadStopInfo", "Get detailed info on why the specified thread stopped")); 271 t.push_back (Packet (query_thread_extra_info, &RNBRemote::HandlePacket_qThreadExtraInfo,NULL, "qThreadExtraInfo", "Get printable status of a thread")); 272 // t.push_back (Packet (query_image_offsets, &RNBRemote::HandlePacket_UNIMPLEMENTED, NULL, "qOffsets", "Report offset of loaded program")); 273 t.push_back (Packet (query_launch_success, &RNBRemote::HandlePacket_qLaunchSuccess,NULL, "qLaunchSuccess", "Report the success or failure of the launch attempt")); 274 t.push_back (Packet (query_register_info, &RNBRemote::HandlePacket_qRegisterInfo, NULL, "qRegisterInfo", "Dynamically discover remote register context information.")); 275 t.push_back (Packet (query_shlib_notify_info_addr, &RNBRemote::HandlePacket_qShlibInfoAddr,NULL, "qShlibInfoAddr", "Returns the address that contains info needed for getting shared library notifications")); 276 t.push_back (Packet (query_step_packet_supported, &RNBRemote::HandlePacket_qStepPacketSupported,NULL, "qStepPacketSupported", "Replys with OK if the 's' packet is supported.")); 277 t.push_back (Packet (query_vattachorwait_supported, &RNBRemote::HandlePacket_qVAttachOrWaitSupported,NULL, "qVAttachOrWaitSupported", "Replys with OK if the 'vAttachOrWait' packet is supported.")); 278 t.push_back (Packet (query_sync_thread_state_supported, &RNBRemote::HandlePacket_qSyncThreadStateSupported,NULL, "qSyncThreadStateSupported", "Replys with OK if the 'QSyncThreadState:' packet is supported.")); 279 t.push_back (Packet (query_host_info, &RNBRemote::HandlePacket_qHostInfo , NULL, "qHostInfo", "Replies with multiple 'key:value;' tuples appended to each other.")); 280 t.push_back (Packet (query_gdb_server_version, &RNBRemote::HandlePacket_qGDBServerVersion , NULL, "qGDBServerVersion", "Replies with multiple 'key:value;' tuples appended to each other.")); 281 t.push_back (Packet (query_process_info, &RNBRemote::HandlePacket_qProcessInfo , NULL, "qProcessInfo", "Replies with multiple 'key:value;' tuples appended to each other.")); 282 t.push_back (Packet (query_symbol_lookup, &RNBRemote::HandlePacket_qSymbol , NULL, "qSymbol:", "Notify that host debugger is ready to do symbol lookups")); 283 t.push_back (Packet (json_query_thread_extended_info,&RNBRemote::HandlePacket_jThreadExtendedInfo , NULL, "jThreadExtendedInfo", "Replies with JSON data of thread extended information.")); 284 t.push_back (Packet (json_query_get_loaded_dynamic_libraries_infos, &RNBRemote::HandlePacket_jGetLoadedDynamicLibrariesInfos, NULL, "jGetLoadedDynamicLibrariesInfos", "Replies with JSON data of all the shared libraries loaded in this process.")); 285 t.push_back (Packet (json_query_threads_info, &RNBRemote::HandlePacket_jThreadsInfo , NULL, "jThreadsInfo", "Replies with JSON data with information about all threads.")); 286 t.push_back (Packet (start_noack_mode, &RNBRemote::HandlePacket_QStartNoAckMode , NULL, "QStartNoAckMode", "Request that " DEBUGSERVER_PROGRAM_NAME " stop acking remote protocol packets")); 287 t.push_back (Packet (prefix_reg_packets_with_tid, &RNBRemote::HandlePacket_QThreadSuffixSupported , NULL, "QThreadSuffixSupported", "Check if thread specific packets (register packets 'g', 'G', 'p', and 'P') support having the thread ID appended to the end of the command")); 288 t.push_back (Packet (set_logging_mode, &RNBRemote::HandlePacket_QSetLogging , NULL, "QSetLogging:", "Check if register packets ('g', 'G', 'p', and 'P' support having the thread ID prefix")); 289 t.push_back (Packet (set_max_packet_size, &RNBRemote::HandlePacket_QSetMaxPacketSize , NULL, "QSetMaxPacketSize:", "Tell " DEBUGSERVER_PROGRAM_NAME " the max sized packet gdb can handle")); 290 t.push_back (Packet (set_max_payload_size, &RNBRemote::HandlePacket_QSetMaxPayloadSize , NULL, "QSetMaxPayloadSize:", "Tell " DEBUGSERVER_PROGRAM_NAME " the max sized payload gdb can handle")); 291 t.push_back (Packet (set_environment_variable, &RNBRemote::HandlePacket_QEnvironment , NULL, "QEnvironment:", "Add an environment variable to the inferior's environment")); 292 t.push_back (Packet (set_environment_variable_hex, &RNBRemote::HandlePacket_QEnvironmentHexEncoded , NULL, "QEnvironmentHexEncoded:", "Add an environment variable to the inferior's environment")); 293 t.push_back (Packet (set_launch_arch, &RNBRemote::HandlePacket_QLaunchArch , NULL, "QLaunchArch:", "Set the architecture to use when launching a process for hosts that can run multiple architecture slices from universal files.")); 294 t.push_back (Packet (set_disable_aslr, &RNBRemote::HandlePacket_QSetDisableASLR , NULL, "QSetDisableASLR:", "Set whether to disable ASLR when launching the process with the set argv ('A') packet")); 295 t.push_back (Packet (set_stdin, &RNBRemote::HandlePacket_QSetSTDIO , NULL, "QSetSTDIN:", "Set the standard input for a process to be launched with the 'A' packet")); 296 t.push_back (Packet (set_stdout, &RNBRemote::HandlePacket_QSetSTDIO , NULL, "QSetSTDOUT:", "Set the standard output for a process to be launched with the 'A' packet")); 297 t.push_back (Packet (set_stderr, &RNBRemote::HandlePacket_QSetSTDIO , NULL, "QSetSTDERR:", "Set the standard error for a process to be launched with the 'A' packet")); 298 t.push_back (Packet (set_working_dir, &RNBRemote::HandlePacket_QSetWorkingDir , NULL, "QSetWorkingDir:", "Set the working directory for a process to be launched with the 'A' packet")); 299 t.push_back (Packet (set_list_threads_in_stop_reply,&RNBRemote::HandlePacket_QListThreadsInStopReply , NULL, "QListThreadsInStopReply", "Set if the 'threads' key should be added to the stop reply packets with a list of all thread IDs.")); 300 t.push_back (Packet (sync_thread_state, &RNBRemote::HandlePacket_QSyncThreadState , NULL, "QSyncThreadState:", "Do whatever is necessary to make sure 'thread' is in a safe state to call functions on.")); 301 // t.push_back (Packet (pass_signals_to_inferior, &RNBRemote::HandlePacket_UNIMPLEMENTED, NULL, "QPassSignals:", "Specify which signals are passed to the inferior")); 302 t.push_back (Packet (allocate_memory, &RNBRemote::HandlePacket_AllocateMemory, NULL, "_M", "Allocate memory in the inferior process.")); 303 t.push_back (Packet (deallocate_memory, &RNBRemote::HandlePacket_DeallocateMemory, NULL, "_m", "Deallocate memory in the inferior process.")); 304 t.push_back (Packet (save_register_state, &RNBRemote::HandlePacket_SaveRegisterState, NULL, "QSaveRegisterState", "Save the register state for the current thread and return a decimal save ID.")); 305 t.push_back (Packet (restore_register_state, &RNBRemote::HandlePacket_RestoreRegisterState, NULL, "QRestoreRegisterState:", "Restore the register state given a save ID previously returned from a call to QSaveRegisterState.")); 306 t.push_back (Packet (memory_region_info, &RNBRemote::HandlePacket_MemoryRegionInfo, NULL, "qMemoryRegionInfo", "Return size and attributes of a memory region that contains the given address")); 307 t.push_back (Packet (get_profile_data, &RNBRemote::HandlePacket_GetProfileData, NULL, "qGetProfileData", "Return profiling data of the current target.")); 308 t.push_back (Packet (set_enable_profiling, &RNBRemote::HandlePacket_SetEnableAsyncProfiling, NULL, "QSetEnableAsyncProfiling", "Enable or disable the profiling of current target.")); 309 t.push_back (Packet (enable_compression, &RNBRemote::HandlePacket_QEnableCompression, NULL, "QEnableCompression:", "Enable compression for the remainder of the connection")); 310 t.push_back (Packet (watchpoint_support_info, &RNBRemote::HandlePacket_WatchpointSupportInfo, NULL, "qWatchpointSupportInfo", "Return the number of supported hardware watchpoints")); 311 t.push_back (Packet (set_process_event, &RNBRemote::HandlePacket_QSetProcessEvent, NULL, "QSetProcessEvent:", "Set a process event, to be passed to the process, can be set before the process is started, or after.")); 312 t.push_back (Packet (set_detach_on_error, &RNBRemote::HandlePacket_QSetDetachOnError, NULL, "QSetDetachOnError:", "Set whether debugserver will detach (1) or kill (0) from the process it is controlling if it loses connection to lldb.")); 313 t.push_back (Packet (speed_test, &RNBRemote::HandlePacket_qSpeedTest, NULL, "qSpeedTest:", "Test the maximum speed at which packet can be sent/received.")); 314 t.push_back (Packet (query_transfer, &RNBRemote::HandlePacket_qXfer, NULL, "qXfer:", "Support the qXfer packet.")); 315 } 316 317 318 void 319 RNBRemote::FlushSTDIO () 320 { 321 if (m_ctx.HasValidProcessID()) 322 { 323 nub_process_t pid = m_ctx.ProcessID(); 324 char buf[256]; 325 nub_size_t count; 326 do 327 { 328 count = DNBProcessGetAvailableSTDOUT(pid, buf, sizeof(buf)); 329 if (count > 0) 330 { 331 SendSTDOUTPacket (buf, count); 332 } 333 } while (count > 0); 334 335 do 336 { 337 count = DNBProcessGetAvailableSTDERR(pid, buf, sizeof(buf)); 338 if (count > 0) 339 { 340 SendSTDERRPacket (buf, count); 341 } 342 } while (count > 0); 343 } 344 } 345 346 void 347 RNBRemote::SendAsyncProfileData () 348 { 349 if (m_ctx.HasValidProcessID()) 350 { 351 nub_process_t pid = m_ctx.ProcessID(); 352 char buf[1024]; 353 nub_size_t count; 354 do 355 { 356 count = DNBProcessGetAvailableProfileData(pid, buf, sizeof(buf)); 357 if (count > 0) 358 { 359 SendAsyncProfileDataPacket (buf, count); 360 } 361 } while (count > 0); 362 } 363 } 364 365 rnb_err_t 366 RNBRemote::SendHexEncodedBytePacket (const char *header, const void *buf, size_t buf_len, const char *footer) 367 { 368 std::ostringstream packet_sstrm; 369 // Append the header cstr if there was one 370 if (header && header[0]) 371 packet_sstrm << header; 372 nub_size_t i; 373 const uint8_t *ubuf8 = (const uint8_t *)buf; 374 for (i=0; i<buf_len; i++) 375 { 376 packet_sstrm << RAWHEX8(ubuf8[i]); 377 } 378 // Append the footer cstr if there was one 379 if (footer && footer[0]) 380 packet_sstrm << footer; 381 382 return SendPacket(packet_sstrm.str()); 383 } 384 385 rnb_err_t 386 RNBRemote::SendSTDOUTPacket (char *buf, nub_size_t buf_size) 387 { 388 if (buf_size == 0) 389 return rnb_success; 390 return SendHexEncodedBytePacket("O", buf, buf_size, NULL); 391 } 392 393 rnb_err_t 394 RNBRemote::SendSTDERRPacket (char *buf, nub_size_t buf_size) 395 { 396 if (buf_size == 0) 397 return rnb_success; 398 return SendHexEncodedBytePacket("O", buf, buf_size, NULL); 399 } 400 401 // This makes use of asynchronous bit 'A' in the gdb remote protocol. 402 rnb_err_t 403 RNBRemote::SendAsyncProfileDataPacket (char *buf, nub_size_t buf_size) 404 { 405 if (buf_size == 0) 406 return rnb_success; 407 408 std::string packet("A"); 409 packet.append(buf, buf_size); 410 return SendPacket(packet); 411 } 412 413 // Given a std::string packet contents to send, possibly encode/compress it. 414 // If compression is enabled, the returned std::string will be in one of two 415 // forms: 416 // 417 // N<original packet contents uncompressed> 418 // C<size of original decompressed packet>:<packet compressed with the requested compression scheme> 419 // 420 // If compression is not requested, the original packet contents are returned 421 422 std::string 423 RNBRemote::CompressString (const std::string &orig) 424 { 425 std::string compressed; 426 compression_types compression_type = GetCompressionType(); 427 if (compression_type != compression_types::none) 428 { 429 bool compress_this_packet = false; 430 431 if (orig.size() > m_compression_minsize) 432 { 433 compress_this_packet = true; 434 } 435 436 if (compress_this_packet) 437 { 438 const size_t encoded_data_buf_size = orig.size() + 128; 439 std::vector<uint8_t> encoded_data (encoded_data_buf_size); 440 size_t compressed_size = 0; 441 442 #if defined (HAVE_LIBCOMPRESSION) 443 if (compression_decode_buffer && compression_type == compression_types::lz4) 444 { 445 compressed_size = compression_encode_buffer (encoded_data.data(), 446 encoded_data_buf_size, 447 (uint8_t*) orig.c_str(), 448 orig.size(), 449 nullptr, 450 COMPRESSION_LZ4_RAW); 451 } 452 if (compression_decode_buffer && compression_type == compression_types::zlib_deflate) 453 { 454 compressed_size = compression_encode_buffer (encoded_data.data(), 455 encoded_data_buf_size, 456 (uint8_t*) orig.c_str(), 457 orig.size(), 458 nullptr, 459 COMPRESSION_ZLIB); 460 } 461 if (compression_decode_buffer && compression_type == compression_types::lzma) 462 { 463 compressed_size = compression_encode_buffer (encoded_data.data(), 464 encoded_data_buf_size, 465 (uint8_t*) orig.c_str(), 466 orig.size(), 467 nullptr, 468 COMPRESSION_LZMA); 469 } 470 if (compression_decode_buffer && compression_type == compression_types::lzfse) 471 { 472 compressed_size = compression_encode_buffer (encoded_data.data(), 473 encoded_data_buf_size, 474 (uint8_t*) orig.c_str(), 475 orig.size(), 476 nullptr, 477 COMPRESSION_LZFSE); 478 } 479 #endif 480 481 #if defined (HAVE_LIBZ) 482 if (compressed_size == 0 && compression_type == compression_types::zlib_deflate) 483 { 484 z_stream stream; 485 memset (&stream, 0, sizeof (z_stream)); 486 stream.next_in = (Bytef *) orig.c_str(); 487 stream.avail_in = (uInt) orig.size(); 488 stream.next_out = (Bytef *) encoded_data.data(); 489 stream.avail_out = (uInt) encoded_data_buf_size; 490 stream.zalloc = Z_NULL; 491 stream.zfree = Z_NULL; 492 stream.opaque = Z_NULL; 493 deflateInit2 (&stream, 5, Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY); 494 int compress_status = deflate (&stream, Z_FINISH); 495 deflateEnd (&stream); 496 if (compress_status == Z_STREAM_END && stream.total_out > 0) 497 { 498 compressed_size = stream.total_out; 499 } 500 } 501 #endif 502 503 if (compressed_size > 0) 504 { 505 compressed.clear (); 506 compressed.reserve (compressed_size); 507 compressed = "C"; 508 char numbuf[16]; 509 snprintf (numbuf, sizeof (numbuf), "%zu:", orig.size()); 510 numbuf[sizeof (numbuf) - 1] = '\0'; 511 compressed.append (numbuf); 512 513 for (size_t i = 0; i < compressed_size; i++) 514 { 515 uint8_t byte = encoded_data[i]; 516 if (byte == '#' || byte == '$' || byte == '}' || byte == '*' || byte == '\0') 517 { 518 compressed.push_back (0x7d); 519 compressed.push_back (byte ^ 0x20); 520 } 521 else 522 { 523 compressed.push_back (byte); 524 } 525 } 526 } 527 else 528 { 529 compressed = "N" + orig; 530 } 531 } 532 else 533 { 534 compressed = "N" + orig; 535 } 536 } 537 else 538 { 539 compressed = orig; 540 } 541 542 return compressed; 543 } 544 545 rnb_err_t 546 RNBRemote::SendPacket (const std::string &s) 547 { 548 DNBLogThreadedIf (LOG_RNB_MAX, "%8d RNBRemote::%s (%s) called", (uint32_t)m_comm.Timer().ElapsedMicroSeconds(true), __FUNCTION__, s.c_str()); 549 550 std::string s_compressed = CompressString (s); 551 552 std::string sendpacket = "$" + s_compressed + "#"; 553 int cksum = 0; 554 char hexbuf[5]; 555 556 if (m_noack_mode) 557 { 558 sendpacket += "00"; 559 } 560 else 561 { 562 for (size_t i = 0; i != s_compressed.size(); ++i) 563 cksum += s_compressed[i]; 564 snprintf (hexbuf, sizeof hexbuf, "%02x", cksum & 0xff); 565 sendpacket += hexbuf; 566 } 567 568 rnb_err_t err = m_comm.Write (sendpacket.c_str(), sendpacket.size()); 569 if (err != rnb_success) 570 return err; 571 572 if (m_noack_mode) 573 return rnb_success; 574 575 std::string reply; 576 RNBRemote::Packet packet; 577 err = GetPacket (reply, packet, true); 578 579 if (err != rnb_success) 580 { 581 DNBLogThreadedIf (LOG_RNB_REMOTE, "%8d RNBRemote::%s (%s) got error trying to get reply...", (uint32_t)m_comm.Timer().ElapsedMicroSeconds(true), __FUNCTION__, sendpacket.c_str()); 582 return err; 583 } 584 585 DNBLogThreadedIf (LOG_RNB_MAX, "%8d RNBRemote::%s (%s) got reply: '%s'", (uint32_t)m_comm.Timer().ElapsedMicroSeconds(true), __FUNCTION__, sendpacket.c_str(), reply.c_str()); 586 587 if (packet.type == ack) 588 return rnb_success; 589 590 // Should we try to resend the packet at this layer? 591 // if (packet.command == nack) 592 return rnb_err; 593 } 594 595 /* Get a packet via gdb remote protocol. 596 Strip off the prefix/suffix, verify the checksum to make sure 597 a valid packet was received, send an ACK if they match. */ 598 599 rnb_err_t 600 RNBRemote::GetPacketPayload (std::string &return_packet) 601 { 602 //DNBLogThreadedIf (LOG_RNB_MAX, "%8u RNBRemote::%s called", (uint32_t)m_comm.Timer().ElapsedMicroSeconds(true), __FUNCTION__); 603 604 PThreadMutex::Locker locker(m_mutex); 605 if (m_rx_packets.empty()) 606 { 607 // Only reset the remote command available event if we have no more packets 608 m_ctx.Events().ResetEvents ( RNBContext::event_read_packet_available ); 609 //DNBLogThreadedIf (LOG_RNB_MAX, "%8u RNBRemote::%s error: no packets available...", (uint32_t)m_comm.Timer().ElapsedMicroSeconds(true), __FUNCTION__); 610 return rnb_err; 611 } 612 613 //DNBLogThreadedIf (LOG_RNB_MAX, "%8u RNBRemote::%s has %u queued packets", (uint32_t)m_comm.Timer().ElapsedMicroSeconds(true), __FUNCTION__, m_rx_packets.size()); 614 return_packet.swap(m_rx_packets.front()); 615 m_rx_packets.pop_front(); 616 locker.Reset(); // Release our lock on the mutex 617 618 if (m_rx_packets.empty()) 619 { 620 // Reset the remote command available event if we have no more packets 621 m_ctx.Events().ResetEvents ( RNBContext::event_read_packet_available ); 622 } 623 624 //DNBLogThreadedIf (LOG_RNB_MEDIUM, "%8u RNBRemote::%s: '%s'", (uint32_t)m_comm.Timer().ElapsedMicroSeconds(true), __FUNCTION__, return_packet.c_str()); 625 626 switch (return_packet[0]) 627 { 628 case '+': 629 case '-': 630 case '\x03': 631 break; 632 633 case '$': 634 { 635 long packet_checksum = 0; 636 if (!m_noack_mode) 637 { 638 for (size_t i = return_packet.size() - 2; i < return_packet.size(); ++i) 639 { 640 char checksum_char = tolower (return_packet[i]); 641 if (!isxdigit (checksum_char)) 642 { 643 m_comm.Write ("-", 1); 644 DNBLogThreadedIf (LOG_RNB_REMOTE, "%8u RNBRemote::%s error: packet with invalid checksum characters: %s", (uint32_t)m_comm.Timer().ElapsedMicroSeconds(true), __FUNCTION__, return_packet.c_str()); 645 return rnb_err; 646 } 647 } 648 packet_checksum = strtol (&return_packet[return_packet.size() - 2], NULL, 16); 649 } 650 651 return_packet.erase(0,1); // Strip the leading '$' 652 return_packet.erase(return_packet.size() - 3);// Strip the #XX checksum 653 654 if (!m_noack_mode) 655 { 656 // Compute the checksum 657 int computed_checksum = 0; 658 for (std::string::iterator it = return_packet.begin (); 659 it != return_packet.end (); 660 ++it) 661 { 662 computed_checksum += *it; 663 } 664 665 if (packet_checksum == (computed_checksum & 0xff)) 666 { 667 //DNBLogThreadedIf (LOG_RNB_MEDIUM, "%8u RNBRemote::%s sending ACK for '%s'", (uint32_t)m_comm.Timer().ElapsedMicroSeconds(true), __FUNCTION__, return_packet.c_str()); 668 m_comm.Write ("+", 1); 669 } 670 else 671 { 672 DNBLogThreadedIf (LOG_RNB_MEDIUM, "%8u RNBRemote::%s sending ACK for '%s' (error: packet checksum mismatch (0x%2.2lx != 0x%2.2x))", 673 (uint32_t)m_comm.Timer().ElapsedMicroSeconds(true), 674 __FUNCTION__, 675 return_packet.c_str(), 676 packet_checksum, 677 computed_checksum); 678 m_comm.Write ("-", 1); 679 return rnb_err; 680 } 681 } 682 } 683 break; 684 685 default: 686 DNBLogThreadedIf (LOG_RNB_REMOTE, "%8u RNBRemote::%s tossing unexpected packet???? %s", (uint32_t)m_comm.Timer().ElapsedMicroSeconds(true), __FUNCTION__, return_packet.c_str()); 687 if (!m_noack_mode) 688 m_comm.Write ("-", 1); 689 return rnb_err; 690 } 691 692 return rnb_success; 693 } 694 695 rnb_err_t 696 RNBRemote::HandlePacket_UNIMPLEMENTED (const char* p) 697 { 698 DNBLogThreadedIf (LOG_RNB_MAX, "%8u RNBRemote::%s(\"%s\")", (uint32_t)m_comm.Timer().ElapsedMicroSeconds(true), __FUNCTION__, p ? p : "NULL"); 699 return SendPacket (""); 700 } 701 702 rnb_err_t 703 RNBRemote::HandlePacket_ILLFORMED (const char *file, int line, const char *p, const char *description) 704 { 705 DNBLogThreadedIf (LOG_RNB_PACKETS, "%8u %s:%i ILLFORMED: '%s' (%s)", (uint32_t)m_comm.Timer().ElapsedMicroSeconds(true), file, line, __FUNCTION__, p); 706 return SendPacket ("E03"); 707 } 708 709 rnb_err_t 710 RNBRemote::GetPacket (std::string &packet_payload, RNBRemote::Packet& packet_info, bool wait) 711 { 712 std::string payload; 713 rnb_err_t err = GetPacketPayload (payload); 714 if (err != rnb_success) 715 { 716 PThreadEvent& events = m_ctx.Events(); 717 nub_event_t set_events = events.GetEventBits(); 718 // TODO: add timeout version of GetPacket?? We would then need to pass 719 // that timeout value along to DNBProcessTimedWaitForEvent. 720 if (!wait || ((set_events & RNBContext::event_read_thread_running) == 0)) 721 return err; 722 723 const nub_event_t events_to_wait_for = RNBContext::event_read_packet_available | RNBContext::event_read_thread_exiting; 724 725 while ((set_events = events.WaitForSetEvents(events_to_wait_for)) != 0) 726 { 727 if (set_events & RNBContext::event_read_packet_available) 728 { 729 // Try the queue again now that we got an event 730 err = GetPacketPayload (payload); 731 if (err == rnb_success) 732 break; 733 } 734 735 if (set_events & RNBContext::event_read_thread_exiting) 736 err = rnb_not_connected; 737 738 if (err == rnb_not_connected) 739 return err; 740 741 } while (err == rnb_err); 742 743 if (set_events == 0) 744 err = rnb_not_connected; 745 } 746 747 if (err == rnb_success) 748 { 749 Packet::iterator it; 750 for (it = m_packets.begin (); it != m_packets.end (); ++it) 751 { 752 if (payload.compare (0, it->abbrev.size(), it->abbrev) == 0) 753 break; 754 } 755 756 // A packet we don't have an entry for. This can happen when we 757 // get a packet that we don't know about or support. We just reply 758 // accordingly and go on. 759 if (it == m_packets.end ()) 760 { 761 DNBLogThreadedIf (LOG_RNB_PACKETS, "unimplemented packet: '%s'", payload.c_str()); 762 HandlePacket_UNIMPLEMENTED(payload.c_str()); 763 return rnb_err; 764 } 765 else 766 { 767 packet_info = *it; 768 packet_payload = payload; 769 } 770 } 771 return err; 772 } 773 774 rnb_err_t 775 RNBRemote::HandleAsyncPacket(PacketEnum *type) 776 { 777 DNBLogThreadedIf (LOG_RNB_REMOTE, "%8u RNBRemote::%s", (uint32_t)m_comm.Timer().ElapsedMicroSeconds(true), __FUNCTION__); 778 static DNBTimer g_packetTimer(true); 779 rnb_err_t err = rnb_err; 780 std::string packet_data; 781 RNBRemote::Packet packet_info; 782 err = GetPacket (packet_data, packet_info, false); 783 784 if (err == rnb_success) 785 { 786 if (!packet_data.empty() && isprint(packet_data[0])) 787 DNBLogThreadedIf (LOG_RNB_REMOTE | LOG_RNB_PACKETS, "HandleAsyncPacket (\"%s\");", packet_data.c_str()); 788 else 789 DNBLogThreadedIf (LOG_RNB_REMOTE | LOG_RNB_PACKETS, "HandleAsyncPacket (%s);", packet_info.printable_name.c_str()); 790 791 HandlePacketCallback packet_callback = packet_info.async; 792 if (packet_callback != NULL) 793 { 794 if (type != NULL) 795 *type = packet_info.type; 796 return (this->*packet_callback)(packet_data.c_str()); 797 } 798 } 799 800 return err; 801 } 802 803 rnb_err_t 804 RNBRemote::HandleReceivedPacket(PacketEnum *type) 805 { 806 static DNBTimer g_packetTimer(true); 807 808 // DNBLogThreadedIf (LOG_RNB_REMOTE, "%8u RNBRemote::%s", (uint32_t)m_comm.Timer().ElapsedMicroSeconds(true), __FUNCTION__); 809 rnb_err_t err = rnb_err; 810 std::string packet_data; 811 RNBRemote::Packet packet_info; 812 err = GetPacket (packet_data, packet_info, false); 813 814 if (err == rnb_success) 815 { 816 DNBLogThreadedIf (LOG_RNB_REMOTE, "HandleReceivedPacket (\"%s\");", packet_data.c_str()); 817 HandlePacketCallback packet_callback = packet_info.normal; 818 if (packet_callback != NULL) 819 { 820 if (type != NULL) 821 *type = packet_info.type; 822 return (this->*packet_callback)(packet_data.c_str()); 823 } 824 else 825 { 826 // Do not fall through to end of this function, if we have valid 827 // packet_info and it has a NULL callback, then we need to respect 828 // that it may not want any response or anything to be done. 829 return err; 830 } 831 } 832 return rnb_err; 833 } 834 835 void 836 RNBRemote::CommDataReceived(const std::string& new_data) 837 { 838 // DNBLogThreadedIf (LOG_RNB_REMOTE, "%8d RNBRemote::%s called", (uint32_t)m_comm.Timer().ElapsedMicroSeconds(true), __FUNCTION__); 839 { 840 // Put the packet data into the buffer in a thread safe fashion 841 PThreadMutex::Locker locker(m_mutex); 842 843 std::string data; 844 // See if we have any left over data from a previous call to this 845 // function? 846 if (!m_rx_partial_data.empty()) 847 { 848 // We do, so lets start with that data 849 data.swap(m_rx_partial_data); 850 } 851 // Append the new incoming data 852 data += new_data; 853 854 // Parse up the packets into gdb remote packets 855 size_t idx = 0; 856 const size_t data_size = data.size(); 857 858 while (idx < data_size) 859 { 860 // end_idx must be one past the last valid packet byte. Start 861 // it off with an invalid value that is the same as the current 862 // index. 863 size_t end_idx = idx; 864 865 switch (data[idx]) 866 { 867 case '+': // Look for ack 868 case '-': // Look for cancel 869 case '\x03': // ^C to halt target 870 end_idx = idx + 1; // The command is one byte long... 871 break; 872 873 case '$': 874 // Look for a standard gdb packet? 875 end_idx = data.find('#', idx + 1); 876 if (end_idx == std::string::npos || end_idx + 3 > data_size) 877 { 878 end_idx = std::string::npos; 879 } 880 else 881 { 882 // Add two for the checksum bytes and 1 to point to the 883 // byte just past the end of this packet 884 end_idx += 3; 885 } 886 break; 887 888 default: 889 break; 890 } 891 892 if (end_idx == std::string::npos) 893 { 894 // Not all data may be here for the packet yet, save it for 895 // next time through this function. 896 m_rx_partial_data += data.substr(idx); 897 //DNBLogThreadedIf (LOG_RNB_MAX, "%8d RNBRemote::%s saving data for later[%u, npos): '%s'",(uint32_t)m_comm.Timer().ElapsedMicroSeconds(true), __FUNCTION__, idx, m_rx_partial_data.c_str()); 898 idx = end_idx; 899 } 900 else 901 if (idx < end_idx) 902 { 903 m_packets_recvd++; 904 // Hack to get rid of initial '+' ACK??? 905 if (m_packets_recvd == 1 && (end_idx == idx + 1) && data[idx] == '+') 906 { 907 //DNBLogThreadedIf (LOG_RNB_REMOTE, "%8d RNBRemote::%s throwing first ACK away....[%u, npos): '+'",(uint32_t)m_comm.Timer().ElapsedMicroSeconds(true), __FUNCTION__, idx); 908 } 909 else 910 { 911 // We have a valid packet... 912 m_rx_packets.push_back(data.substr(idx, end_idx - idx)); 913 DNBLogThreadedIf (LOG_RNB_PACKETS, "getpkt: %s", m_rx_packets.back().c_str()); 914 } 915 idx = end_idx; 916 } 917 else 918 { 919 DNBLogThreadedIf (LOG_RNB_MAX, "%8d RNBRemote::%s tossing junk byte at %c",(uint32_t)m_comm.Timer().ElapsedMicroSeconds(true), __FUNCTION__, data[idx]); 920 idx = idx + 1; 921 } 922 } 923 } 924 925 if (!m_rx_packets.empty()) 926 { 927 // Let the main thread know we have received a packet 928 929 //DNBLogThreadedIf (LOG_RNB_EVENTS, "%8d RNBRemote::%s called events.SetEvent(RNBContext::event_read_packet_available)", (uint32_t)m_comm.Timer().ElapsedMicroSeconds(true), __FUNCTION__); 930 PThreadEvent& events = m_ctx.Events(); 931 events.SetEvents (RNBContext::event_read_packet_available); 932 } 933 } 934 935 rnb_err_t 936 RNBRemote::GetCommData () 937 { 938 // DNBLogThreadedIf (LOG_RNB_REMOTE, "%8d RNBRemote::%s called", (uint32_t)m_comm.Timer().ElapsedMicroSeconds(true), __FUNCTION__); 939 std::string comm_data; 940 rnb_err_t err = m_comm.Read (comm_data); 941 if (err == rnb_success) 942 { 943 if (!comm_data.empty()) 944 CommDataReceived (comm_data); 945 } 946 return err; 947 } 948 949 void 950 RNBRemote::StartReadRemoteDataThread() 951 { 952 DNBLogThreadedIf (LOG_RNB_REMOTE, "%8u RNBRemote::%s called", (uint32_t)m_comm.Timer().ElapsedMicroSeconds(true), __FUNCTION__); 953 PThreadEvent& events = m_ctx.Events(); 954 if ((events.GetEventBits() & RNBContext::event_read_thread_running) == 0) 955 { 956 events.ResetEvents (RNBContext::event_read_thread_exiting); 957 int err = ::pthread_create (&m_rx_pthread, NULL, ThreadFunctionReadRemoteData, this); 958 if (err == 0) 959 { 960 // Our thread was successfully kicked off, wait for it to 961 // set the started event so we can safely continue 962 events.WaitForSetEvents (RNBContext::event_read_thread_running); 963 } 964 else 965 { 966 events.ResetEvents (RNBContext::event_read_thread_running); 967 events.SetEvents (RNBContext::event_read_thread_exiting); 968 } 969 } 970 } 971 972 void 973 RNBRemote::StopReadRemoteDataThread() 974 { 975 DNBLogThreadedIf (LOG_RNB_REMOTE, "%8u RNBRemote::%s called", (uint32_t)m_comm.Timer().ElapsedMicroSeconds(true), __FUNCTION__); 976 PThreadEvent& events = m_ctx.Events(); 977 if ((events.GetEventBits() & RNBContext::event_read_thread_running) == RNBContext::event_read_thread_running) 978 { 979 m_comm.Disconnect(true); 980 struct timespec timeout_abstime; 981 DNBTimer::OffsetTimeOfDay(&timeout_abstime, 2, 0); 982 983 // Wait for 2 seconds for the remote data thread to exit 984 if (events.WaitForSetEvents(RNBContext::event_read_thread_exiting, &timeout_abstime) == 0) 985 { 986 // Kill the remote data thread??? 987 } 988 } 989 } 990 991 992 void* 993 RNBRemote::ThreadFunctionReadRemoteData(void *arg) 994 { 995 // Keep a shared pointer reference so this doesn't go away on us before the thread is killed. 996 DNBLogThreadedIf(LOG_RNB_REMOTE, "RNBRemote::%s (%p): thread starting...", __FUNCTION__, arg); 997 RNBRemoteSP remoteSP(g_remoteSP); 998 if (remoteSP.get() != NULL) 999 { 1000 1001 #if defined (__APPLE__) 1002 pthread_setname_np ("read gdb-remote packets thread"); 1003 #if defined (__arm__) || defined (__arm64__) || defined (__aarch64__) 1004 struct sched_param thread_param; 1005 int thread_sched_policy; 1006 if (pthread_getschedparam(pthread_self(), &thread_sched_policy, &thread_param) == 0) 1007 { 1008 thread_param.sched_priority = 47; 1009 pthread_setschedparam(pthread_self(), thread_sched_policy, &thread_param); 1010 } 1011 #endif 1012 #endif 1013 1014 RNBRemote* remote = remoteSP.get(); 1015 PThreadEvent& events = remote->Context().Events(); 1016 events.SetEvents (RNBContext::event_read_thread_running); 1017 // START: main receive remote command thread loop 1018 bool done = false; 1019 while (!done) 1020 { 1021 rnb_err_t err = remote->GetCommData(); 1022 1023 switch (err) 1024 { 1025 case rnb_success: 1026 break; 1027 1028 default: 1029 case rnb_err: 1030 DNBLogThreadedIf (LOG_RNB_REMOTE, "RNBSocket::GetCommData returned error %u", err); 1031 done = true; 1032 break; 1033 1034 case rnb_not_connected: 1035 DNBLogThreadedIf (LOG_RNB_REMOTE, "RNBSocket::GetCommData returned not connected..."); 1036 done = true; 1037 break; 1038 } 1039 } 1040 // START: main receive remote command thread loop 1041 events.ResetEvents (RNBContext::event_read_thread_running); 1042 events.SetEvents (RNBContext::event_read_thread_exiting); 1043 } 1044 DNBLogThreadedIf(LOG_RNB_REMOTE, "RNBRemote::%s (%p): thread exiting...", __FUNCTION__, arg); 1045 return NULL; 1046 } 1047 1048 1049 // If we fail to get back a valid CPU type for the remote process, 1050 // make a best guess for the CPU type based on the currently running 1051 // debugserver binary -- the debugger may not handle the case of an 1052 // un-specified process CPU type correctly. 1053 1054 static cpu_type_t 1055 best_guess_cpu_type () 1056 { 1057 #if defined (__arm__) || defined (__arm64__) || defined (__aarch64__) 1058 if (sizeof (char *) == 8) 1059 { 1060 return CPU_TYPE_ARM64; 1061 } 1062 else 1063 { 1064 return CPU_TYPE_ARM; 1065 } 1066 #elif defined (__i386__) || defined (__x86_64__) 1067 if (sizeof (char*) == 8) 1068 { 1069 return CPU_TYPE_X86_64; 1070 } 1071 else 1072 { 1073 return CPU_TYPE_I386; 1074 } 1075 #endif 1076 return 0; 1077 } 1078 1079 1080 /* Read the bytes in STR which are GDB Remote Protocol binary encoded bytes 1081 (8-bit bytes). 1082 This encoding uses 0x7d ('}') as an escape character for 1083 0x7d ('}'), 0x23 ('#'), 0x24 ('$'), 0x2a ('*'). 1084 LEN is the number of bytes to be processed. If a character is escaped, 1085 it is 2 characters for LEN. A LEN of -1 means decode-until-nul-byte 1086 (end of string). */ 1087 1088 std::vector<uint8_t> 1089 decode_binary_data (const char *str, size_t len) 1090 { 1091 std::vector<uint8_t> bytes; 1092 if (len == 0) 1093 { 1094 return bytes; 1095 } 1096 if (len == (size_t)-1) 1097 len = strlen (str); 1098 1099 while (len--) 1100 { 1101 unsigned char c = *str; 1102 if (c == 0x7d && len > 0) 1103 { 1104 len--; 1105 str++; 1106 c = *str ^ 0x20; 1107 } 1108 bytes.push_back (c); 1109 } 1110 return bytes; 1111 } 1112 1113 // Quote any meta characters in a std::string as per the binary 1114 // packet convention in the gdb-remote protocol. 1115 1116 std::string 1117 binary_encode_string (const std::string &s) 1118 { 1119 std::string output; 1120 const size_t s_size = s.size(); 1121 const char *s_chars = s.c_str(); 1122 1123 for (size_t i = 0; i < s_size; i++) 1124 { 1125 unsigned char ch = *(s_chars + i); 1126 if (ch == '#' || ch == '$' || ch == '}' || ch == '*') 1127 { 1128 output.push_back ('}'); // 0x7d 1129 output.push_back (ch ^ 0x20); 1130 } 1131 else 1132 { 1133 output.push_back (ch); 1134 } 1135 } 1136 return output; 1137 } 1138 1139 // If the value side of a key-value pair in JSON is a string, 1140 // and that string has a " character in it, the " character must 1141 // be escaped. 1142 1143 std::string 1144 json_string_quote_metachars (const std::string &s) 1145 { 1146 if (s.find('"') == std::string::npos) 1147 return s; 1148 1149 std::string output; 1150 const size_t s_size = s.size(); 1151 const char *s_chars = s.c_str(); 1152 for (size_t i = 0; i < s_size; i++) 1153 { 1154 unsigned char ch = *(s_chars + i); 1155 if (ch == '"') 1156 { 1157 output.push_back ('\\'); 1158 } 1159 output.push_back (ch); 1160 } 1161 return output; 1162 } 1163 1164 typedef struct register_map_entry 1165 { 1166 uint32_t gdb_regnum; // gdb register number 1167 uint32_t offset; // Offset in bytes into the register context data with no padding between register values 1168 DNBRegisterInfo nub_info; // debugnub register info 1169 std::vector<uint32_t> value_regnums; 1170 std::vector<uint32_t> invalidate_regnums; 1171 } register_map_entry_t; 1172 1173 1174 1175 // If the notion of registers differs from what is handed out by the 1176 // architecture, then flavors can be defined here. 1177 1178 static std::vector<register_map_entry_t> g_dynamic_register_map; 1179 static register_map_entry_t *g_reg_entries = NULL; 1180 static size_t g_num_reg_entries = 0; 1181 1182 void 1183 RNBRemote::Initialize() 1184 { 1185 DNBInitialize(); 1186 } 1187 1188 1189 bool 1190 RNBRemote::InitializeRegisters (bool force) 1191 { 1192 pid_t pid = m_ctx.ProcessID(); 1193 if (pid == INVALID_NUB_PROCESS) 1194 return false; 1195 1196 DNBLogThreadedIf (LOG_RNB_PROC, "RNBRemote::%s() getting native registers from DNB interface", __FUNCTION__); 1197 // Discover the registers by querying the DNB interface and letting it 1198 // state the registers that it would like to export. This allows the 1199 // registers to be discovered using multiple qRegisterInfo calls to get 1200 // all register information after the architecture for the process is 1201 // determined. 1202 if (force) 1203 { 1204 g_dynamic_register_map.clear(); 1205 g_reg_entries = NULL; 1206 g_num_reg_entries = 0; 1207 } 1208 1209 if (g_dynamic_register_map.empty()) 1210 { 1211 nub_size_t num_reg_sets = 0; 1212 const DNBRegisterSetInfo *reg_sets = DNBGetRegisterSetInfo (&num_reg_sets); 1213 1214 assert (num_reg_sets > 0 && reg_sets != NULL); 1215 1216 uint32_t regnum = 0; 1217 uint32_t reg_data_offset = 0; 1218 typedef std::map<std::string, uint32_t> NameToRegNum; 1219 NameToRegNum name_to_regnum; 1220 for (nub_size_t set = 0; set < num_reg_sets; ++set) 1221 { 1222 if (reg_sets[set].registers == NULL) 1223 continue; 1224 1225 for (uint32_t reg=0; reg < reg_sets[set].num_registers; ++reg) 1226 { 1227 register_map_entry_t reg_entry = { 1228 regnum++, // register number starts at zero and goes up with no gaps 1229 reg_data_offset, // Offset into register context data, no gaps between registers 1230 reg_sets[set].registers[reg] // DNBRegisterInfo 1231 }; 1232 1233 name_to_regnum[reg_entry.nub_info.name] = reg_entry.gdb_regnum; 1234 1235 if (reg_entry.nub_info.value_regs == NULL) 1236 { 1237 reg_data_offset += reg_entry.nub_info.size; 1238 } 1239 1240 g_dynamic_register_map.push_back (reg_entry); 1241 } 1242 } 1243 1244 // Now we must find any registers whose values are in other registers and fix up 1245 // the offsets since we removed all gaps... 1246 for (auto ®_entry: g_dynamic_register_map) 1247 { 1248 if (reg_entry.nub_info.value_regs) 1249 { 1250 uint32_t new_offset = UINT32_MAX; 1251 for (size_t i=0; reg_entry.nub_info.value_regs[i] != NULL; ++i) 1252 { 1253 const char *name = reg_entry.nub_info.value_regs[i]; 1254 auto pos = name_to_regnum.find(name); 1255 if (pos != name_to_regnum.end()) 1256 { 1257 regnum = pos->second; 1258 reg_entry.value_regnums.push_back(regnum); 1259 if (regnum < g_dynamic_register_map.size()) 1260 { 1261 // The offset for value_regs registers is the offset within the register with the lowest offset 1262 const uint32_t reg_offset = g_dynamic_register_map[regnum].offset + reg_entry.nub_info.offset; 1263 if (new_offset > reg_offset) 1264 new_offset = reg_offset; 1265 } 1266 } 1267 } 1268 1269 if (new_offset != UINT32_MAX) 1270 { 1271 reg_entry.offset = new_offset; 1272 } 1273 else 1274 { 1275 DNBLogThreaded("no offset was calculated entry for register %s", reg_entry.nub_info.name); 1276 reg_entry.offset = UINT32_MAX; 1277 } 1278 } 1279 1280 if (reg_entry.nub_info.update_regs) 1281 { 1282 for (size_t i=0; reg_entry.nub_info.update_regs[i] != NULL; ++i) 1283 { 1284 const char *name = reg_entry.nub_info.update_regs[i]; 1285 auto pos = name_to_regnum.find(name); 1286 if (pos != name_to_regnum.end()) 1287 { 1288 regnum = pos->second; 1289 reg_entry.invalidate_regnums.push_back(regnum); 1290 } 1291 } 1292 } 1293 } 1294 1295 1296 // for (auto ®_entry: g_dynamic_register_map) 1297 // { 1298 // DNBLogThreaded("%4i: size = %3u, pseudo = %i, name = %s", 1299 // reg_entry.offset, 1300 // reg_entry.nub_info.size, 1301 // reg_entry.nub_info.value_regs != NULL, 1302 // reg_entry.nub_info.name); 1303 // } 1304 1305 g_reg_entries = g_dynamic_register_map.data(); 1306 g_num_reg_entries = g_dynamic_register_map.size(); 1307 } 1308 return true; 1309 } 1310 1311 /* The inferior has stopped executing; send a packet 1312 to gdb to let it know. */ 1313 1314 void 1315 RNBRemote::NotifyThatProcessStopped (void) 1316 { 1317 RNBRemote::HandlePacket_last_signal (NULL); 1318 return; 1319 } 1320 1321 1322 /* 'A arglen,argnum,arg,...' 1323 Update the inferior context CTX with the program name and arg 1324 list. 1325 The documentation for this packet is underwhelming but my best reading 1326 of this is that it is a series of (len, position #, arg)'s, one for 1327 each argument with "arg" hex encoded (two 0-9a-f chars?). 1328 Why we need BOTH a "len" and a hex encoded "arg" is beyond me - either 1329 is sufficient to get around the "," position separator escape issue. 1330 1331 e.g. our best guess for a valid 'A' packet for "gdb -q a.out" is 1332 1333 6,0,676462,4,1,2d71,10,2,612e6f7574 1334 1335 Note that "argnum" and "arglen" are numbers in base 10. Again, that's 1336 not documented either way but I'm assuming it's so. */ 1337 1338 rnb_err_t 1339 RNBRemote::HandlePacket_A (const char *p) 1340 { 1341 if (p == NULL || *p == '\0') 1342 { 1343 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Null packet for 'A' pkt"); 1344 } 1345 p++; 1346 if (*p == '\0' || !isdigit (*p)) 1347 { 1348 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "arglen not specified on 'A' pkt"); 1349 } 1350 1351 /* I promise I don't modify it anywhere in this function. strtoul()'s 1352 2nd arg has to be non-const which makes it problematic to step 1353 through the string easily. */ 1354 char *buf = const_cast<char *>(p); 1355 1356 RNBContext& ctx = Context(); 1357 1358 while (*buf != '\0') 1359 { 1360 unsigned long arglen, argnum; 1361 std::string arg; 1362 char *c; 1363 1364 errno = 0; 1365 arglen = strtoul (buf, &c, 10); 1366 if (errno != 0 && arglen == 0) 1367 { 1368 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "arglen not a number on 'A' pkt"); 1369 } 1370 if (*c != ',') 1371 { 1372 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "arglen not followed by comma on 'A' pkt"); 1373 } 1374 buf = c + 1; 1375 1376 errno = 0; 1377 argnum = strtoul (buf, &c, 10); 1378 if (errno != 0 && argnum == 0) 1379 { 1380 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "argnum not a number on 'A' pkt"); 1381 } 1382 if (*c != ',') 1383 { 1384 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "arglen not followed by comma on 'A' pkt"); 1385 } 1386 buf = c + 1; 1387 1388 c = buf; 1389 buf = buf + arglen; 1390 while (c < buf && *c != '\0' && c + 1 < buf && *(c + 1) != '\0') 1391 { 1392 char smallbuf[3]; 1393 smallbuf[0] = *c; 1394 smallbuf[1] = *(c + 1); 1395 smallbuf[2] = '\0'; 1396 1397 errno = 0; 1398 int ch = static_cast<int>(strtoul (smallbuf, NULL, 16)); 1399 if (errno != 0 && ch == 0) 1400 { 1401 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "non-hex char in arg on 'A' pkt"); 1402 } 1403 1404 arg.push_back(ch); 1405 c += 2; 1406 } 1407 1408 ctx.PushArgument (arg.c_str()); 1409 if (*buf == ',') 1410 buf++; 1411 } 1412 SendPacket ("OK"); 1413 1414 return rnb_success; 1415 } 1416 1417 /* 'H c t' 1418 Set the thread for subsequent actions; 'c' for step/continue ops, 1419 'g' for other ops. -1 means all threads, 0 means any thread. */ 1420 1421 rnb_err_t 1422 RNBRemote::HandlePacket_H (const char *p) 1423 { 1424 p++; // skip 'H' 1425 if (*p != 'c' && *p != 'g') 1426 { 1427 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Missing 'c' or 'g' type in H packet"); 1428 } 1429 1430 if (!m_ctx.HasValidProcessID()) 1431 { 1432 // We allow gdb to connect to a server that hasn't started running 1433 // the target yet. gdb still wants to ask questions about it and 1434 // freaks out if it gets an error. So just return OK here. 1435 } 1436 1437 errno = 0; 1438 nub_thread_t tid = strtoul (p + 1, NULL, 16); 1439 if (errno != 0 && tid == 0) 1440 { 1441 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Invalid thread number in H packet"); 1442 } 1443 if (*p == 'c') 1444 SetContinueThread (tid); 1445 if (*p == 'g') 1446 SetCurrentThread (tid); 1447 1448 return SendPacket ("OK"); 1449 } 1450 1451 1452 rnb_err_t 1453 RNBRemote::HandlePacket_qLaunchSuccess (const char *p) 1454 { 1455 if (m_ctx.HasValidProcessID() || m_ctx.LaunchStatus().Error() == 0) 1456 return SendPacket("OK"); 1457 std::ostringstream ret_str; 1458 std::string status_str; 1459 ret_str << "E" << m_ctx.LaunchStatusAsString(status_str); 1460 1461 return SendPacket (ret_str.str()); 1462 } 1463 1464 rnb_err_t 1465 RNBRemote::HandlePacket_qShlibInfoAddr (const char *p) 1466 { 1467 if (m_ctx.HasValidProcessID()) 1468 { 1469 nub_addr_t shlib_info_addr = DNBProcessGetSharedLibraryInfoAddress(m_ctx.ProcessID()); 1470 if (shlib_info_addr != INVALID_NUB_ADDRESS) 1471 { 1472 std::ostringstream ostrm; 1473 ostrm << RAW_HEXBASE << shlib_info_addr; 1474 return SendPacket (ostrm.str ()); 1475 } 1476 } 1477 return SendPacket ("E44"); 1478 } 1479 1480 rnb_err_t 1481 RNBRemote::HandlePacket_qStepPacketSupported (const char *p) 1482 { 1483 // Normally the "s" packet is mandatory, yet in gdb when using ARM, they 1484 // get around the need for this packet by implementing software single 1485 // stepping from gdb. Current versions of debugserver do support the "s" 1486 // packet, yet some older versions do not. We need a way to tell if this 1487 // packet is supported so we can disable software single stepping in gdb 1488 // for remote targets (so the "s" packet will get used). 1489 return SendPacket("OK"); 1490 } 1491 1492 rnb_err_t 1493 RNBRemote::HandlePacket_qSyncThreadStateSupported (const char *p) 1494 { 1495 // We support attachOrWait meaning attach if the process exists, otherwise wait to attach. 1496 return SendPacket("OK"); 1497 } 1498 1499 rnb_err_t 1500 RNBRemote::HandlePacket_qVAttachOrWaitSupported (const char *p) 1501 { 1502 // We support attachOrWait meaning attach if the process exists, otherwise wait to attach. 1503 return SendPacket("OK"); 1504 } 1505 1506 rnb_err_t 1507 RNBRemote::HandlePacket_qThreadStopInfo (const char *p) 1508 { 1509 p += strlen ("qThreadStopInfo"); 1510 nub_thread_t tid = strtoul(p, 0, 16); 1511 return SendStopReplyPacketForThread (tid); 1512 } 1513 1514 rnb_err_t 1515 RNBRemote::HandlePacket_qThreadInfo (const char *p) 1516 { 1517 // We allow gdb to connect to a server that hasn't started running 1518 // the target yet. gdb still wants to ask questions about it and 1519 // freaks out if it gets an error. So just return OK here. 1520 nub_process_t pid = m_ctx.ProcessID(); 1521 if (pid == INVALID_NUB_PROCESS) 1522 return SendPacket ("OK"); 1523 1524 // Only "qfThreadInfo" and "qsThreadInfo" get into this function so 1525 // we only need to check the second byte to tell which is which 1526 if (p[1] == 'f') 1527 { 1528 nub_size_t numthreads = DNBProcessGetNumThreads (pid); 1529 std::ostringstream ostrm; 1530 ostrm << "m"; 1531 bool first = true; 1532 for (nub_size_t i = 0; i < numthreads; ++i) 1533 { 1534 if (first) 1535 first = false; 1536 else 1537 ostrm << ","; 1538 nub_thread_t th = DNBProcessGetThreadAtIndex (pid, i); 1539 ostrm << std::hex << th; 1540 } 1541 return SendPacket (ostrm.str ()); 1542 } 1543 else 1544 { 1545 return SendPacket ("l"); 1546 } 1547 } 1548 1549 rnb_err_t 1550 RNBRemote::HandlePacket_qThreadExtraInfo (const char *p) 1551 { 1552 // We allow gdb to connect to a server that hasn't started running 1553 // the target yet. gdb still wants to ask questions about it and 1554 // freaks out if it gets an error. So just return OK here. 1555 nub_process_t pid = m_ctx.ProcessID(); 1556 if (pid == INVALID_NUB_PROCESS) 1557 return SendPacket ("OK"); 1558 1559 /* This is supposed to return a string like 'Runnable' or 1560 'Blocked on Mutex'. 1561 The returned string is formatted like the "A" packet - a 1562 sequence of letters encoded in as 2-hex-chars-per-letter. */ 1563 p += strlen ("qThreadExtraInfo"); 1564 if (*p++ != ',') 1565 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Illformed qThreadExtraInfo packet"); 1566 errno = 0; 1567 nub_thread_t tid = strtoul (p, NULL, 16); 1568 if (errno != 0 && tid == 0) 1569 { 1570 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Invalid thread number in qThreadExtraInfo packet"); 1571 } 1572 1573 const char * threadInfo = DNBThreadGetInfo(pid, tid); 1574 if (threadInfo != NULL && threadInfo[0]) 1575 { 1576 return SendHexEncodedBytePacket(NULL, threadInfo, strlen(threadInfo), NULL); 1577 } 1578 else 1579 { 1580 // "OK" == 4f6b 1581 // Return "OK" as a ASCII hex byte stream if things go wrong 1582 return SendPacket ("4f6b"); 1583 } 1584 1585 return SendPacket (""); 1586 } 1587 1588 1589 const char *k_space_delimiters = " \t"; 1590 static void 1591 skip_spaces (std::string &line) 1592 { 1593 if (!line.empty()) 1594 { 1595 size_t space_pos = line.find_first_not_of (k_space_delimiters); 1596 if (space_pos > 0) 1597 line.erase(0, space_pos); 1598 } 1599 } 1600 1601 static std::string 1602 get_identifier (std::string &line) 1603 { 1604 std::string word; 1605 skip_spaces (line); 1606 const size_t line_size = line.size(); 1607 size_t end_pos; 1608 for (end_pos = 0; end_pos < line_size; ++end_pos) 1609 { 1610 if (end_pos == 0) 1611 { 1612 if (isalpha(line[end_pos]) || line[end_pos] == '_') 1613 continue; 1614 } 1615 else if (isalnum(line[end_pos]) || line[end_pos] == '_') 1616 continue; 1617 break; 1618 } 1619 word.assign (line, 0, end_pos); 1620 line.erase(0, end_pos); 1621 return word; 1622 } 1623 1624 static std::string 1625 get_operator (std::string &line) 1626 { 1627 std::string op; 1628 skip_spaces (line); 1629 if (!line.empty()) 1630 { 1631 if (line[0] == '=') 1632 { 1633 op = '='; 1634 line.erase(0,1); 1635 } 1636 } 1637 return op; 1638 } 1639 1640 static std::string 1641 get_value (std::string &line) 1642 { 1643 std::string value; 1644 skip_spaces (line); 1645 if (!line.empty()) 1646 { 1647 value.swap(line); 1648 } 1649 return value; 1650 } 1651 1652 extern void FileLogCallback(void *baton, uint32_t flags, const char *format, va_list args); 1653 extern void ASLLogCallback(void *baton, uint32_t flags, const char *format, va_list args); 1654 1655 rnb_err_t 1656 RNBRemote::HandlePacket_qRcmd (const char *p) 1657 { 1658 const char *c = p + strlen("qRcmd,"); 1659 std::string line; 1660 while (c[0] && c[1]) 1661 { 1662 char smallbuf[3] = { c[0], c[1], '\0' }; 1663 errno = 0; 1664 int ch = static_cast<int>(strtoul (smallbuf, NULL, 16)); 1665 if (errno != 0 && ch == 0) 1666 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "non-hex char in payload of qRcmd packet"); 1667 line.push_back(ch); 1668 c += 2; 1669 } 1670 if (*c == '\0') 1671 { 1672 std::string command = get_identifier(line); 1673 if (command.compare("set") == 0) 1674 { 1675 std::string variable = get_identifier (line); 1676 std::string op = get_operator (line); 1677 std::string value = get_value (line); 1678 if (variable.compare("logfile") == 0) 1679 { 1680 FILE *log_file = fopen(value.c_str(), "w"); 1681 if (log_file) 1682 { 1683 DNBLogSetLogCallback(FileLogCallback, log_file); 1684 return SendPacket ("OK"); 1685 } 1686 return SendPacket ("E71"); 1687 } 1688 else if (variable.compare("logmask") == 0) 1689 { 1690 char *end; 1691 errno = 0; 1692 uint32_t logmask = static_cast<uint32_t>(strtoul (value.c_str(), &end, 0)); 1693 if (errno == 0 && end && *end == '\0') 1694 { 1695 DNBLogSetLogMask (logmask); 1696 if (!DNBLogGetLogCallback()) 1697 DNBLogSetLogCallback(ASLLogCallback, NULL); 1698 return SendPacket ("OK"); 1699 } 1700 errno = 0; 1701 logmask = static_cast<uint32_t>(strtoul (value.c_str(), &end, 16)); 1702 if (errno == 0 && end && *end == '\0') 1703 { 1704 DNBLogSetLogMask (logmask); 1705 return SendPacket ("OK"); 1706 } 1707 return SendPacket ("E72"); 1708 } 1709 return SendPacket ("E70"); 1710 } 1711 return SendPacket ("E69"); 1712 } 1713 return SendPacket ("E73"); 1714 } 1715 1716 rnb_err_t 1717 RNBRemote::HandlePacket_qC (const char *p) 1718 { 1719 nub_thread_t tid; 1720 std::ostringstream rep; 1721 // If we haven't run the process yet, we tell the debugger the 1722 // pid is 0. That way it can know to tell use to run later on. 1723 if (!m_ctx.HasValidProcessID()) 1724 tid = 0; 1725 else 1726 { 1727 // Grab the current thread. 1728 tid = DNBProcessGetCurrentThread (m_ctx.ProcessID()); 1729 // Make sure we set the current thread so g and p packets return 1730 // the data the gdb will expect. 1731 SetCurrentThread (tid); 1732 } 1733 rep << "QC" << std::hex << tid; 1734 return SendPacket (rep.str()); 1735 } 1736 1737 rnb_err_t 1738 RNBRemote::HandlePacket_qEcho (const char *p) 1739 { 1740 // Just send the exact same packet back that we received to 1741 // synchronize the response packets after a previous packet 1742 // timed out. This allows the debugger to get back on track 1743 // with responses after a packet timeout. 1744 return SendPacket (p); 1745 } 1746 1747 rnb_err_t 1748 RNBRemote::HandlePacket_qGetPid (const char *p) 1749 { 1750 nub_process_t pid; 1751 std::ostringstream rep; 1752 // If we haven't run the process yet, we tell the debugger the 1753 // pid is 0. That way it can know to tell use to run later on. 1754 if (m_ctx.HasValidProcessID()) 1755 pid = m_ctx.ProcessID(); 1756 else 1757 pid = 0; 1758 rep << std::hex << pid; 1759 return SendPacket (rep.str()); 1760 } 1761 1762 rnb_err_t 1763 RNBRemote::HandlePacket_qRegisterInfo (const char *p) 1764 { 1765 if (g_num_reg_entries == 0) 1766 InitializeRegisters (); 1767 1768 p += strlen ("qRegisterInfo"); 1769 1770 nub_size_t num_reg_sets = 0; 1771 const DNBRegisterSetInfo *reg_set_info = DNBGetRegisterSetInfo (&num_reg_sets); 1772 uint32_t reg_num = static_cast<uint32_t>(strtoul(p, 0, 16)); 1773 1774 if (reg_num < g_num_reg_entries) 1775 { 1776 const register_map_entry_t *reg_entry = &g_reg_entries[reg_num]; 1777 std::ostringstream ostrm; 1778 if (reg_entry->nub_info.name) 1779 ostrm << "name:" << reg_entry->nub_info.name << ';'; 1780 if (reg_entry->nub_info.alt) 1781 ostrm << "alt-name:" << reg_entry->nub_info.alt << ';'; 1782 1783 ostrm << "bitsize:" << std::dec << reg_entry->nub_info.size * 8 << ';'; 1784 ostrm << "offset:" << std::dec << reg_entry->offset << ';'; 1785 1786 switch (reg_entry->nub_info.type) 1787 { 1788 case Uint: ostrm << "encoding:uint;"; break; 1789 case Sint: ostrm << "encoding:sint;"; break; 1790 case IEEE754: ostrm << "encoding:ieee754;"; break; 1791 case Vector: ostrm << "encoding:vector;"; break; 1792 } 1793 1794 switch (reg_entry->nub_info.format) 1795 { 1796 case Binary: ostrm << "format:binary;"; break; 1797 case Decimal: ostrm << "format:decimal;"; break; 1798 case Hex: ostrm << "format:hex;"; break; 1799 case Float: ostrm << "format:float;"; break; 1800 case VectorOfSInt8: ostrm << "format:vector-sint8;"; break; 1801 case VectorOfUInt8: ostrm << "format:vector-uint8;"; break; 1802 case VectorOfSInt16: ostrm << "format:vector-sint16;"; break; 1803 case VectorOfUInt16: ostrm << "format:vector-uint16;"; break; 1804 case VectorOfSInt32: ostrm << "format:vector-sint32;"; break; 1805 case VectorOfUInt32: ostrm << "format:vector-uint32;"; break; 1806 case VectorOfFloat32: ostrm << "format:vector-float32;"; break; 1807 case VectorOfUInt128: ostrm << "format:vector-uint128;"; break; 1808 }; 1809 1810 if (reg_set_info && reg_entry->nub_info.set < num_reg_sets) 1811 ostrm << "set:" << reg_set_info[reg_entry->nub_info.set].name << ';'; 1812 1813 if (reg_entry->nub_info.reg_gcc != INVALID_NUB_REGNUM) 1814 ostrm << "gcc:" << std::dec << reg_entry->nub_info.reg_gcc << ';'; 1815 1816 if (reg_entry->nub_info.reg_dwarf != INVALID_NUB_REGNUM) 1817 ostrm << "dwarf:" << std::dec << reg_entry->nub_info.reg_dwarf << ';'; 1818 1819 switch (reg_entry->nub_info.reg_generic) 1820 { 1821 case GENERIC_REGNUM_FP: ostrm << "generic:fp;"; break; 1822 case GENERIC_REGNUM_PC: ostrm << "generic:pc;"; break; 1823 case GENERIC_REGNUM_SP: ostrm << "generic:sp;"; break; 1824 case GENERIC_REGNUM_RA: ostrm << "generic:ra;"; break; 1825 case GENERIC_REGNUM_FLAGS: ostrm << "generic:flags;"; break; 1826 case GENERIC_REGNUM_ARG1: ostrm << "generic:arg1;"; break; 1827 case GENERIC_REGNUM_ARG2: ostrm << "generic:arg2;"; break; 1828 case GENERIC_REGNUM_ARG3: ostrm << "generic:arg3;"; break; 1829 case GENERIC_REGNUM_ARG4: ostrm << "generic:arg4;"; break; 1830 case GENERIC_REGNUM_ARG5: ostrm << "generic:arg5;"; break; 1831 case GENERIC_REGNUM_ARG6: ostrm << "generic:arg6;"; break; 1832 case GENERIC_REGNUM_ARG7: ostrm << "generic:arg7;"; break; 1833 case GENERIC_REGNUM_ARG8: ostrm << "generic:arg8;"; break; 1834 default: break; 1835 } 1836 1837 if (!reg_entry->value_regnums.empty()) 1838 { 1839 ostrm << "container-regs:"; 1840 for (size_t i=0, n=reg_entry->value_regnums.size(); i < n; ++i) 1841 { 1842 if (i > 0) 1843 ostrm << ','; 1844 ostrm << RAW_HEXBASE << reg_entry->value_regnums[i]; 1845 } 1846 ostrm << ';'; 1847 } 1848 1849 if (!reg_entry->invalidate_regnums.empty()) 1850 { 1851 ostrm << "invalidate-regs:"; 1852 for (size_t i=0, n=reg_entry->invalidate_regnums.size(); i < n; ++i) 1853 { 1854 if (i > 0) 1855 ostrm << ','; 1856 ostrm << RAW_HEXBASE << reg_entry->invalidate_regnums[i]; 1857 } 1858 ostrm << ';'; 1859 } 1860 1861 return SendPacket (ostrm.str ()); 1862 } 1863 return SendPacket ("E45"); 1864 } 1865 1866 1867 /* This expects a packet formatted like 1868 1869 QSetLogging:bitmask=LOG_ALL|LOG_RNB_REMOTE; 1870 1871 with the "QSetLogging:" already removed from the start. Maybe in the 1872 future this packet will include other keyvalue pairs like 1873 1874 QSetLogging:bitmask=LOG_ALL;mode=asl; 1875 */ 1876 1877 rnb_err_t 1878 set_logging (const char *p) 1879 { 1880 int bitmask = 0; 1881 while (p && *p != '\0') 1882 { 1883 if (strncmp (p, "bitmask=", sizeof ("bitmask=") - 1) == 0) 1884 { 1885 p += sizeof ("bitmask=") - 1; 1886 while (p && *p != '\0' && *p != ';') 1887 { 1888 if (*p == '|') 1889 p++; 1890 1891 // to regenerate the LOG_ entries (not including the LOG_RNB entries) 1892 // $ for logname in `grep '^#define LOG_' DNBDefs.h | egrep -v 'LOG_HI|LOG_LO' | awk '{print $2}'` 1893 // do 1894 // echo " else if (strncmp (p, \"$logname\", sizeof (\"$logname\") - 1) == 0)" 1895 // echo " {" 1896 // echo " p += sizeof (\"$logname\") - 1;" 1897 // echo " bitmask |= $logname;" 1898 // echo " }" 1899 // done 1900 if (strncmp (p, "LOG_VERBOSE", sizeof ("LOG_VERBOSE") - 1) == 0) 1901 { 1902 p += sizeof ("LOG_VERBOSE") - 1; 1903 bitmask |= LOG_VERBOSE; 1904 } 1905 else if (strncmp (p, "LOG_PROCESS", sizeof ("LOG_PROCESS") - 1) == 0) 1906 { 1907 p += sizeof ("LOG_PROCESS") - 1; 1908 bitmask |= LOG_PROCESS; 1909 } 1910 else if (strncmp (p, "LOG_THREAD", sizeof ("LOG_THREAD") - 1) == 0) 1911 { 1912 p += sizeof ("LOG_THREAD") - 1; 1913 bitmask |= LOG_THREAD; 1914 } 1915 else if (strncmp (p, "LOG_EXCEPTIONS", sizeof ("LOG_EXCEPTIONS") - 1) == 0) 1916 { 1917 p += sizeof ("LOG_EXCEPTIONS") - 1; 1918 bitmask |= LOG_EXCEPTIONS; 1919 } 1920 else if (strncmp (p, "LOG_SHLIB", sizeof ("LOG_SHLIB") - 1) == 0) 1921 { 1922 p += sizeof ("LOG_SHLIB") - 1; 1923 bitmask |= LOG_SHLIB; 1924 } 1925 else if (strncmp (p, "LOG_MEMORY", sizeof ("LOG_MEMORY") - 1) == 0) 1926 { 1927 p += sizeof ("LOG_MEMORY") - 1; 1928 bitmask |= LOG_MEMORY; 1929 } 1930 else if (strncmp (p, "LOG_MEMORY_DATA_SHORT", sizeof ("LOG_MEMORY_DATA_SHORT") - 1) == 0) 1931 { 1932 p += sizeof ("LOG_MEMORY_DATA_SHORT") - 1; 1933 bitmask |= LOG_MEMORY_DATA_SHORT; 1934 } 1935 else if (strncmp (p, "LOG_MEMORY_DATA_LONG", sizeof ("LOG_MEMORY_DATA_LONG") - 1) == 0) 1936 { 1937 p += sizeof ("LOG_MEMORY_DATA_LONG") - 1; 1938 bitmask |= LOG_MEMORY_DATA_LONG; 1939 } 1940 else if (strncmp (p, "LOG_MEMORY_PROTECTIONS", sizeof ("LOG_MEMORY_PROTECTIONS") - 1) == 0) 1941 { 1942 p += sizeof ("LOG_MEMORY_PROTECTIONS") - 1; 1943 bitmask |= LOG_MEMORY_PROTECTIONS; 1944 } 1945 else if (strncmp (p, "LOG_BREAKPOINTS", sizeof ("LOG_BREAKPOINTS") - 1) == 0) 1946 { 1947 p += sizeof ("LOG_BREAKPOINTS") - 1; 1948 bitmask |= LOG_BREAKPOINTS; 1949 } 1950 else if (strncmp (p, "LOG_EVENTS", sizeof ("LOG_EVENTS") - 1) == 0) 1951 { 1952 p += sizeof ("LOG_EVENTS") - 1; 1953 bitmask |= LOG_EVENTS; 1954 } 1955 else if (strncmp (p, "LOG_WATCHPOINTS", sizeof ("LOG_WATCHPOINTS") - 1) == 0) 1956 { 1957 p += sizeof ("LOG_WATCHPOINTS") - 1; 1958 bitmask |= LOG_WATCHPOINTS; 1959 } 1960 else if (strncmp (p, "LOG_STEP", sizeof ("LOG_STEP") - 1) == 0) 1961 { 1962 p += sizeof ("LOG_STEP") - 1; 1963 bitmask |= LOG_STEP; 1964 } 1965 else if (strncmp (p, "LOG_TASK", sizeof ("LOG_TASK") - 1) == 0) 1966 { 1967 p += sizeof ("LOG_TASK") - 1; 1968 bitmask |= LOG_TASK; 1969 } 1970 else if (strncmp (p, "LOG_ALL", sizeof ("LOG_ALL") - 1) == 0) 1971 { 1972 p += sizeof ("LOG_ALL") - 1; 1973 bitmask |= LOG_ALL; 1974 } 1975 else if (strncmp (p, "LOG_DEFAULT", sizeof ("LOG_DEFAULT") - 1) == 0) 1976 { 1977 p += sizeof ("LOG_DEFAULT") - 1; 1978 bitmask |= LOG_DEFAULT; 1979 } 1980 // end of auto-generated entries 1981 1982 else if (strncmp (p, "LOG_NONE", sizeof ("LOG_NONE") - 1) == 0) 1983 { 1984 p += sizeof ("LOG_NONE") - 1; 1985 bitmask = 0; 1986 } 1987 else if (strncmp (p, "LOG_RNB_MINIMAL", sizeof ("LOG_RNB_MINIMAL") - 1) == 0) 1988 { 1989 p += sizeof ("LOG_RNB_MINIMAL") - 1; 1990 bitmask |= LOG_RNB_MINIMAL; 1991 } 1992 else if (strncmp (p, "LOG_RNB_MEDIUM", sizeof ("LOG_RNB_MEDIUM") - 1) == 0) 1993 { 1994 p += sizeof ("LOG_RNB_MEDIUM") - 1; 1995 bitmask |= LOG_RNB_MEDIUM; 1996 } 1997 else if (strncmp (p, "LOG_RNB_MAX", sizeof ("LOG_RNB_MAX") - 1) == 0) 1998 { 1999 p += sizeof ("LOG_RNB_MAX") - 1; 2000 bitmask |= LOG_RNB_MAX; 2001 } 2002 else if (strncmp (p, "LOG_RNB_COMM", sizeof ("LOG_RNB_COMM") - 1) == 0) 2003 { 2004 p += sizeof ("LOG_RNB_COMM") - 1; 2005 bitmask |= LOG_RNB_COMM; 2006 } 2007 else if (strncmp (p, "LOG_RNB_REMOTE", sizeof ("LOG_RNB_REMOTE") - 1) == 0) 2008 { 2009 p += sizeof ("LOG_RNB_REMOTE") - 1; 2010 bitmask |= LOG_RNB_REMOTE; 2011 } 2012 else if (strncmp (p, "LOG_RNB_EVENTS", sizeof ("LOG_RNB_EVENTS") - 1) == 0) 2013 { 2014 p += sizeof ("LOG_RNB_EVENTS") - 1; 2015 bitmask |= LOG_RNB_EVENTS; 2016 } 2017 else if (strncmp (p, "LOG_RNB_PROC", sizeof ("LOG_RNB_PROC") - 1) == 0) 2018 { 2019 p += sizeof ("LOG_RNB_PROC") - 1; 2020 bitmask |= LOG_RNB_PROC; 2021 } 2022 else if (strncmp (p, "LOG_RNB_PACKETS", sizeof ("LOG_RNB_PACKETS") - 1) == 0) 2023 { 2024 p += sizeof ("LOG_RNB_PACKETS") - 1; 2025 bitmask |= LOG_RNB_PACKETS; 2026 } 2027 else if (strncmp (p, "LOG_RNB_ALL", sizeof ("LOG_RNB_ALL") - 1) == 0) 2028 { 2029 p += sizeof ("LOG_RNB_ALL") - 1; 2030 bitmask |= LOG_RNB_ALL; 2031 } 2032 else if (strncmp (p, "LOG_RNB_DEFAULT", sizeof ("LOG_RNB_DEFAULT") - 1) == 0) 2033 { 2034 p += sizeof ("LOG_RNB_DEFAULT") - 1; 2035 bitmask |= LOG_RNB_DEFAULT; 2036 } 2037 else if (strncmp (p, "LOG_RNB_NONE", sizeof ("LOG_RNB_NONE") - 1) == 0) 2038 { 2039 p += sizeof ("LOG_RNB_NONE") - 1; 2040 bitmask = 0; 2041 } 2042 else 2043 { 2044 /* Unrecognized logging bit; ignore it. */ 2045 const char *c = strchr (p, '|'); 2046 if (c) 2047 { 2048 p = c; 2049 } 2050 else 2051 { 2052 c = strchr (p, ';'); 2053 if (c) 2054 { 2055 p = c; 2056 } 2057 else 2058 { 2059 // Improperly terminated word; just go to end of str 2060 p = strchr (p, '\0'); 2061 } 2062 } 2063 } 2064 } 2065 // Did we get a properly formatted logging bitmask? 2066 if (p && *p == ';') 2067 { 2068 // Enable DNB logging 2069 DNBLogSetLogCallback(ASLLogCallback, NULL); 2070 DNBLogSetLogMask (bitmask); 2071 p++; 2072 } 2073 } 2074 // We're not going to support logging to a file for now. All logging 2075 // goes through ASL. 2076 #if 0 2077 else if (strncmp (p, "mode=", sizeof ("mode=") - 1) == 0) 2078 { 2079 p += sizeof ("mode=") - 1; 2080 if (strncmp (p, "asl;", sizeof ("asl;") - 1) == 0) 2081 { 2082 DNBLogToASL (); 2083 p += sizeof ("asl;") - 1; 2084 } 2085 else if (strncmp (p, "file;", sizeof ("file;") - 1) == 0) 2086 { 2087 DNBLogToFile (); 2088 p += sizeof ("file;") - 1; 2089 } 2090 else 2091 { 2092 // Ignore unknown argument 2093 const char *c = strchr (p, ';'); 2094 if (c) 2095 p = c + 1; 2096 else 2097 p = strchr (p, '\0'); 2098 } 2099 } 2100 else if (strncmp (p, "filename=", sizeof ("filename=") - 1) == 0) 2101 { 2102 p += sizeof ("filename=") - 1; 2103 const char *c = strchr (p, ';'); 2104 if (c == NULL) 2105 { 2106 c = strchr (p, '\0'); 2107 continue; 2108 } 2109 char *fn = (char *) alloca (c - p + 1); 2110 strncpy (fn, p, c - p); 2111 fn[c - p] = '\0'; 2112 2113 // A file name of "asl" is special and is another way to indicate 2114 // that logging should be done via ASL, not by file. 2115 if (strcmp (fn, "asl") == 0) 2116 { 2117 DNBLogToASL (); 2118 } 2119 else 2120 { 2121 FILE *f = fopen (fn, "w"); 2122 if (f) 2123 { 2124 DNBLogSetLogFile (f); 2125 DNBEnableLogging (f, DNBLogGetLogMask ()); 2126 DNBLogToFile (); 2127 } 2128 } 2129 p = c + 1; 2130 } 2131 #endif /* #if 0 to enforce ASL logging only. */ 2132 else 2133 { 2134 // Ignore unknown argument 2135 const char *c = strchr (p, ';'); 2136 if (c) 2137 p = c + 1; 2138 else 2139 p = strchr (p, '\0'); 2140 } 2141 } 2142 2143 return rnb_success; 2144 } 2145 2146 rnb_err_t 2147 RNBRemote::HandlePacket_QThreadSuffixSupported (const char *p) 2148 { 2149 m_thread_suffix_supported = true; 2150 return SendPacket ("OK"); 2151 } 2152 2153 rnb_err_t 2154 RNBRemote::HandlePacket_QStartNoAckMode (const char *p) 2155 { 2156 // Send the OK packet first so the correct checksum is appended... 2157 rnb_err_t result = SendPacket ("OK"); 2158 m_noack_mode = true; 2159 return result; 2160 } 2161 2162 2163 rnb_err_t 2164 RNBRemote::HandlePacket_QSetLogging (const char *p) 2165 { 2166 p += sizeof ("QSetLogging:") - 1; 2167 rnb_err_t result = set_logging (p); 2168 if (result == rnb_success) 2169 return SendPacket ("OK"); 2170 else 2171 return SendPacket ("E35"); 2172 } 2173 2174 rnb_err_t 2175 RNBRemote::HandlePacket_QSetDisableASLR (const char *p) 2176 { 2177 extern int g_disable_aslr; 2178 p += sizeof ("QSetDisableASLR:") - 1; 2179 switch (*p) 2180 { 2181 case '0': g_disable_aslr = 0; break; 2182 case '1': g_disable_aslr = 1; break; 2183 default: 2184 return SendPacket ("E56"); 2185 } 2186 return SendPacket ("OK"); 2187 } 2188 2189 rnb_err_t 2190 RNBRemote::HandlePacket_QSetSTDIO (const char *p) 2191 { 2192 // Only set stdin/out/err if we don't already have a process 2193 if (!m_ctx.HasValidProcessID()) 2194 { 2195 bool success = false; 2196 // Check the seventh character since the packet will be one of: 2197 // QSetSTDIN 2198 // QSetSTDOUT 2199 // QSetSTDERR 2200 StringExtractor packet(p); 2201 packet.SetFilePos (7); 2202 char ch = packet.GetChar(); 2203 while (packet.GetChar() != ':') 2204 /* Do nothing. */; 2205 2206 switch (ch) 2207 { 2208 case 'I': // STDIN 2209 packet.GetHexByteString (m_ctx.GetSTDIN()); 2210 success = !m_ctx.GetSTDIN().empty(); 2211 break; 2212 2213 case 'O': // STDOUT 2214 packet.GetHexByteString (m_ctx.GetSTDOUT()); 2215 success = !m_ctx.GetSTDOUT().empty(); 2216 break; 2217 2218 case 'E': // STDERR 2219 packet.GetHexByteString (m_ctx.GetSTDERR()); 2220 success = !m_ctx.GetSTDERR().empty(); 2221 break; 2222 2223 default: 2224 break; 2225 } 2226 if (success) 2227 return SendPacket ("OK"); 2228 return SendPacket ("E57"); 2229 } 2230 return SendPacket ("E58"); 2231 } 2232 2233 rnb_err_t 2234 RNBRemote::HandlePacket_QSetWorkingDir (const char *p) 2235 { 2236 // Only set the working directory if we don't already have a process 2237 if (!m_ctx.HasValidProcessID()) 2238 { 2239 StringExtractor packet(p += sizeof ("QSetWorkingDir:") - 1); 2240 if (packet.GetHexByteString (m_ctx.GetWorkingDir())) 2241 { 2242 struct stat working_dir_stat; 2243 if (::stat(m_ctx.GetWorkingDirPath(), &working_dir_stat) == -1) 2244 { 2245 m_ctx.GetWorkingDir().clear(); 2246 return SendPacket ("E61"); // Working directory doesn't exist... 2247 } 2248 else if ((working_dir_stat.st_mode & S_IFMT) == S_IFDIR) 2249 { 2250 return SendPacket ("OK"); 2251 } 2252 else 2253 { 2254 m_ctx.GetWorkingDir().clear(); 2255 return SendPacket ("E62"); // Working directory isn't a directory... 2256 } 2257 } 2258 return SendPacket ("E59"); // Invalid path 2259 } 2260 return SendPacket ("E60"); // Already had a process, too late to set working dir 2261 } 2262 2263 rnb_err_t 2264 RNBRemote::HandlePacket_QSyncThreadState (const char *p) 2265 { 2266 if (!m_ctx.HasValidProcessID()) 2267 { 2268 // We allow gdb to connect to a server that hasn't started running 2269 // the target yet. gdb still wants to ask questions about it and 2270 // freaks out if it gets an error. So just return OK here. 2271 return SendPacket ("OK"); 2272 } 2273 2274 errno = 0; 2275 p += strlen("QSyncThreadState:"); 2276 nub_thread_t tid = strtoul (p, NULL, 16); 2277 if (errno != 0 && tid == 0) 2278 { 2279 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Invalid thread number in QSyncThreadState packet"); 2280 } 2281 if (DNBProcessSyncThreadState(m_ctx.ProcessID(), tid)) 2282 return SendPacket("OK"); 2283 else 2284 return SendPacket ("E61"); 2285 } 2286 2287 rnb_err_t 2288 RNBRemote::HandlePacket_QSetDetachOnError (const char *p) 2289 { 2290 p += sizeof ("QSetDetachOnError:") - 1; 2291 bool should_detach = true; 2292 switch (*p) 2293 { 2294 case '0': should_detach = false; break; 2295 case '1': should_detach = true; break; 2296 default: 2297 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Invalid value for QSetDetachOnError - should be 0 or 1"); 2298 break; 2299 } 2300 2301 m_ctx.SetDetachOnError(should_detach); 2302 return SendPacket ("OK"); 2303 } 2304 2305 rnb_err_t 2306 RNBRemote::HandlePacket_QListThreadsInStopReply (const char *p) 2307 { 2308 // If this packet is received, it allows us to send an extra key/value 2309 // pair in the stop reply packets where we will list all of the thread IDs 2310 // separated by commas: 2311 // 2312 // "threads:10a,10b,10c;" 2313 // 2314 // This will get included in the stop reply packet as something like: 2315 // 2316 // "T11thread:10a;00:00000000;01:00010203:threads:10a,10b,10c;" 2317 // 2318 // This can save two packets on each stop: qfThreadInfo/qsThreadInfo and 2319 // speed things up a bit. 2320 // 2321 // Send the OK packet first so the correct checksum is appended... 2322 rnb_err_t result = SendPacket ("OK"); 2323 m_list_threads_in_stop_reply = true; 2324 2325 return result; 2326 } 2327 2328 2329 rnb_err_t 2330 RNBRemote::HandlePacket_QSetMaxPayloadSize (const char *p) 2331 { 2332 /* The number of characters in a packet payload that gdb is 2333 prepared to accept. The packet-start char, packet-end char, 2334 2 checksum chars and terminating null character are not included 2335 in this size. */ 2336 p += sizeof ("QSetMaxPayloadSize:") - 1; 2337 errno = 0; 2338 uint32_t size = static_cast<uint32_t>(strtoul (p, NULL, 16)); 2339 if (errno != 0 && size == 0) 2340 { 2341 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Invalid length in QSetMaxPayloadSize packet"); 2342 } 2343 m_max_payload_size = size; 2344 return SendPacket ("OK"); 2345 } 2346 2347 rnb_err_t 2348 RNBRemote::HandlePacket_QSetMaxPacketSize (const char *p) 2349 { 2350 /* This tells us the largest packet that gdb can handle. 2351 i.e. the size of gdb's packet-reading buffer. 2352 QSetMaxPayloadSize is preferred because it is less ambiguous. */ 2353 p += sizeof ("QSetMaxPacketSize:") - 1; 2354 errno = 0; 2355 uint32_t size = static_cast<uint32_t>(strtoul (p, NULL, 16)); 2356 if (errno != 0 && size == 0) 2357 { 2358 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Invalid length in QSetMaxPacketSize packet"); 2359 } 2360 m_max_payload_size = size - 5; 2361 return SendPacket ("OK"); 2362 } 2363 2364 2365 2366 2367 rnb_err_t 2368 RNBRemote::HandlePacket_QEnvironment (const char *p) 2369 { 2370 /* This sets the environment for the target program. The packet is of the form: 2371 2372 QEnvironment:VARIABLE=VALUE 2373 2374 */ 2375 2376 DNBLogThreadedIf (LOG_RNB_REMOTE, "%8u RNBRemote::%s Handling QEnvironment: \"%s\"", 2377 (uint32_t)m_comm.Timer().ElapsedMicroSeconds(true), __FUNCTION__, p); 2378 2379 p += sizeof ("QEnvironment:") - 1; 2380 RNBContext& ctx = Context(); 2381 2382 ctx.PushEnvironment (p); 2383 return SendPacket ("OK"); 2384 } 2385 2386 rnb_err_t 2387 RNBRemote::HandlePacket_QEnvironmentHexEncoded (const char *p) 2388 { 2389 /* This sets the environment for the target program. The packet is of the form: 2390 2391 QEnvironmentHexEncoded:VARIABLE=VALUE 2392 2393 The VARIABLE=VALUE part is sent hex-encoded so characters like '#' with special 2394 meaning in the remote protocol won't break it. 2395 */ 2396 2397 DNBLogThreadedIf (LOG_RNB_REMOTE, "%8u RNBRemote::%s Handling QEnvironmentHexEncoded: \"%s\"", 2398 (uint32_t)m_comm.Timer().ElapsedMicroSeconds(true), __FUNCTION__, p); 2399 2400 p += sizeof ("QEnvironmentHexEncoded:") - 1; 2401 2402 std::string arg; 2403 const char *c; 2404 c = p; 2405 while (*c != '\0') 2406 { 2407 if (*(c + 1) == '\0') 2408 { 2409 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "non-hex char in arg on 'QEnvironmentHexEncoded' pkt"); 2410 } 2411 char smallbuf[3]; 2412 smallbuf[0] = *c; 2413 smallbuf[1] = *(c + 1); 2414 smallbuf[2] = '\0'; 2415 errno = 0; 2416 int ch = static_cast<int>(strtoul (smallbuf, NULL, 16)); 2417 if (errno != 0 && ch == 0) 2418 { 2419 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "non-hex char in arg on 'QEnvironmentHexEncoded' pkt"); 2420 } 2421 arg.push_back(ch); 2422 c += 2; 2423 } 2424 2425 RNBContext& ctx = Context(); 2426 if (arg.length() > 0) 2427 ctx.PushEnvironment (arg.c_str()); 2428 2429 return SendPacket ("OK"); 2430 } 2431 2432 2433 rnb_err_t 2434 RNBRemote::HandlePacket_QLaunchArch (const char *p) 2435 { 2436 p += sizeof ("QLaunchArch:") - 1; 2437 if (DNBSetArchitecture(p)) 2438 return SendPacket ("OK"); 2439 return SendPacket ("E63"); 2440 } 2441 2442 rnb_err_t 2443 RNBRemote::HandlePacket_QSetProcessEvent (const char *p) 2444 { 2445 p += sizeof ("QSetProcessEvent:") - 1; 2446 // If the process is running, then send the event to the process, otherwise 2447 // store it in the context. 2448 if (Context().HasValidProcessID()) 2449 { 2450 if (DNBProcessSendEvent (Context().ProcessID(), p)) 2451 return SendPacket("OK"); 2452 else 2453 return SendPacket ("E80"); 2454 } 2455 else 2456 { 2457 Context().PushProcessEvent(p); 2458 } 2459 return SendPacket ("OK"); 2460 } 2461 2462 void 2463 append_hex_value (std::ostream& ostrm, const void *buf, size_t buf_size, bool swap) 2464 { 2465 int i; 2466 const uint8_t *p = (const uint8_t *)buf; 2467 if (swap) 2468 { 2469 for (i = static_cast<int>(buf_size)-1; i >= 0; i--) 2470 ostrm << RAWHEX8(p[i]); 2471 } 2472 else 2473 { 2474 for (size_t i = 0; i < buf_size; i++) 2475 ostrm << RAWHEX8(p[i]); 2476 } 2477 } 2478 2479 void 2480 append_hexified_string (std::ostream& ostrm, const std::string &string) 2481 { 2482 size_t string_size = string.size(); 2483 const char *string_buf = string.c_str(); 2484 for (size_t i = 0; i < string_size; i++) 2485 { 2486 ostrm << RAWHEX8(*(string_buf + i)); 2487 } 2488 } 2489 2490 2491 2492 void 2493 register_value_in_hex_fixed_width (std::ostream& ostrm, 2494 nub_process_t pid, 2495 nub_thread_t tid, 2496 const register_map_entry_t* reg, 2497 const DNBRegisterValue *reg_value_ptr) 2498 { 2499 if (reg != NULL) 2500 { 2501 DNBRegisterValue reg_value; 2502 if (reg_value_ptr == NULL) 2503 { 2504 if (DNBThreadGetRegisterValueByID (pid, tid, reg->nub_info.set, reg->nub_info.reg, ®_value)) 2505 reg_value_ptr = ®_value; 2506 } 2507 2508 if (reg_value_ptr) 2509 { 2510 append_hex_value (ostrm, reg_value_ptr->value.v_uint8, reg->nub_info.size, false); 2511 } 2512 else 2513 { 2514 // If we fail to read a register value, check if it has a default 2515 // fail value. If it does, return this instead in case some of 2516 // the registers are not available on the current system. 2517 if (reg->nub_info.size > 0) 2518 { 2519 std::basic_string<uint8_t> zeros(reg->nub_info.size, '\0'); 2520 append_hex_value (ostrm, zeros.data(), zeros.size(), false); 2521 } 2522 } 2523 } 2524 } 2525 2526 2527 void 2528 gdb_regnum_with_fixed_width_hex_register_value (std::ostream& ostrm, 2529 nub_process_t pid, 2530 nub_thread_t tid, 2531 const register_map_entry_t* reg, 2532 const DNBRegisterValue *reg_value_ptr) 2533 { 2534 // Output the register number as 'NN:VVVVVVVV;' where NN is a 2 bytes HEX 2535 // gdb register number, and VVVVVVVV is the correct number of hex bytes 2536 // as ASCII for the register value. 2537 if (reg != NULL) 2538 { 2539 ostrm << RAWHEX8(reg->gdb_regnum) << ':'; 2540 register_value_in_hex_fixed_width (ostrm, pid, tid, reg, reg_value_ptr); 2541 ostrm << ';'; 2542 } 2543 } 2544 2545 2546 void 2547 RNBRemote::DispatchQueueOffsets::GetThreadQueueInfo (nub_process_t pid, 2548 nub_addr_t dispatch_qaddr, 2549 std::string &queue_name, 2550 uint64_t &queue_width, 2551 uint64_t &queue_serialnum) const 2552 { 2553 queue_name.clear(); 2554 queue_width = 0; 2555 queue_serialnum = 0; 2556 2557 if (IsValid() && dispatch_qaddr != INVALID_NUB_ADDRESS && dispatch_qaddr != 0) 2558 { 2559 nub_addr_t dispatch_queue_addr = DNBProcessMemoryReadPointer (pid, dispatch_qaddr); 2560 if (dispatch_queue_addr) 2561 { 2562 queue_width = DNBProcessMemoryReadInteger (pid, dispatch_queue_addr + dqo_width, dqo_width_size, 0); 2563 queue_serialnum = DNBProcessMemoryReadInteger (pid, dispatch_queue_addr + dqo_serialnum, dqo_serialnum_size, 0); 2564 2565 if (dqo_version >= 4) 2566 { 2567 // libdispatch versions 4+, pointer to dispatch name is in the 2568 // queue structure. 2569 nub_addr_t pointer_to_label_address = dispatch_queue_addr + dqo_label; 2570 nub_addr_t label_addr = DNBProcessMemoryReadPointer (pid, pointer_to_label_address); 2571 if (label_addr) 2572 queue_name = std::move(DNBProcessMemoryReadCString (pid, label_addr)); 2573 } 2574 else 2575 { 2576 // libdispatch versions 1-3, dispatch name is a fixed width char array 2577 // in the queue structure. 2578 queue_name = std::move(DNBProcessMemoryReadCStringFixed(pid, dispatch_queue_addr + dqo_label, dqo_label_size)); 2579 } 2580 } 2581 } 2582 } 2583 2584 struct StackMemory 2585 { 2586 uint8_t bytes[2*sizeof(nub_addr_t)]; 2587 nub_size_t length; 2588 }; 2589 typedef std::map<nub_addr_t, StackMemory> StackMemoryMap; 2590 2591 2592 static void 2593 ReadStackMemory (nub_process_t pid, nub_thread_t tid, StackMemoryMap &stack_mmap, uint32_t backtrace_limit = 256) 2594 { 2595 DNBRegisterValue reg_value; 2596 if (DNBThreadGetRegisterValueByID(pid, tid, REGISTER_SET_GENERIC, GENERIC_REGNUM_FP, ®_value)) 2597 { 2598 uint32_t frame_count = 0; 2599 uint64_t fp = 0; 2600 if (reg_value.info.size == 4) 2601 fp = reg_value.value.uint32; 2602 else 2603 fp = reg_value.value.uint64; 2604 while (fp != 0) 2605 { 2606 // Make sure we never recurse more than 256 times so we don't recurse too far or 2607 // store up too much memory in the expedited cache 2608 if (++frame_count > backtrace_limit) 2609 break; 2610 2611 const nub_size_t read_size = reg_value.info.size*2; 2612 StackMemory stack_memory; 2613 stack_memory.length = read_size; 2614 if (DNBProcessMemoryRead(pid, fp, read_size, stack_memory.bytes) != read_size) 2615 break; 2616 // Make sure we don't try to put the same stack memory in more than once 2617 if (stack_mmap.find(fp) != stack_mmap.end()) 2618 break; 2619 // Put the entry into the cache 2620 stack_mmap[fp] = stack_memory; 2621 // Dereference the frame pointer to get to the previous frame pointer 2622 if (reg_value.info.size == 4) 2623 fp = ((uint32_t *)stack_memory.bytes)[0]; 2624 else 2625 fp = ((uint64_t *)stack_memory.bytes)[0]; 2626 } 2627 } 2628 } 2629 2630 rnb_err_t 2631 RNBRemote::SendStopReplyPacketForThread (nub_thread_t tid) 2632 { 2633 const nub_process_t pid = m_ctx.ProcessID(); 2634 if (pid == INVALID_NUB_PROCESS) 2635 return SendPacket("E50"); 2636 2637 struct DNBThreadStopInfo tid_stop_info; 2638 2639 /* Fill the remaining space in this packet with as many registers 2640 as we can stuff in there. */ 2641 2642 if (DNBThreadGetStopReason (pid, tid, &tid_stop_info)) 2643 { 2644 const bool did_exec = tid_stop_info.reason == eStopTypeExec; 2645 if (did_exec) 2646 { 2647 RNBRemote::InitializeRegisters(true); 2648 2649 // Reset any symbols that need resetting when we exec 2650 m_dispatch_queue_offsets_addr = INVALID_NUB_ADDRESS; 2651 m_dispatch_queue_offsets.Clear(); 2652 } 2653 2654 std::ostringstream ostrm; 2655 // Output the T packet with the thread 2656 ostrm << 'T'; 2657 int signum = tid_stop_info.details.signal.signo; 2658 DNBLogThreadedIf (LOG_RNB_PROC, "%8d %s got signal signo = %u, exc_type = %u", (uint32_t)m_comm.Timer().ElapsedMicroSeconds(true), __FUNCTION__, signum, tid_stop_info.details.exception.type); 2659 2660 // Translate any mach exceptions to gdb versions, unless they are 2661 // common exceptions like a breakpoint or a soft signal. 2662 switch (tid_stop_info.details.exception.type) 2663 { 2664 default: signum = 0; break; 2665 case EXC_BREAKPOINT: signum = SIGTRAP; break; 2666 case EXC_BAD_ACCESS: signum = TARGET_EXC_BAD_ACCESS; break; 2667 case EXC_BAD_INSTRUCTION: signum = TARGET_EXC_BAD_INSTRUCTION; break; 2668 case EXC_ARITHMETIC: signum = TARGET_EXC_ARITHMETIC; break; 2669 case EXC_EMULATION: signum = TARGET_EXC_EMULATION; break; 2670 case EXC_SOFTWARE: 2671 if (tid_stop_info.details.exception.data_count == 2 && 2672 tid_stop_info.details.exception.data[0] == EXC_SOFT_SIGNAL) 2673 signum = static_cast<int>(tid_stop_info.details.exception.data[1]); 2674 else 2675 signum = TARGET_EXC_SOFTWARE; 2676 break; 2677 } 2678 2679 ostrm << RAWHEX8(signum & 0xff); 2680 2681 ostrm << std::hex << "thread:" << tid << ';'; 2682 2683 const char *thread_name = DNBThreadGetName (pid, tid); 2684 if (thread_name && thread_name[0]) 2685 { 2686 size_t thread_name_len = strlen(thread_name); 2687 2688 2689 if (::strcspn (thread_name, "$#+-;:") == thread_name_len) 2690 ostrm << std::hex << "name:" << thread_name << ';'; 2691 else 2692 { 2693 // the thread name contains special chars, send as hex bytes 2694 ostrm << std::hex << "hexname:"; 2695 uint8_t *u_thread_name = (uint8_t *)thread_name; 2696 for (size_t i = 0; i < thread_name_len; i++) 2697 ostrm << RAWHEX8(u_thread_name[i]); 2698 ostrm << ';'; 2699 } 2700 } 2701 2702 thread_identifier_info_data_t thread_ident_info; 2703 if (DNBThreadGetIdentifierInfo (pid, tid, &thread_ident_info)) 2704 { 2705 if (thread_ident_info.dispatch_qaddr != 0) 2706 { 2707 ostrm << "qaddr:" << std::hex << thread_ident_info.dispatch_qaddr << ';'; 2708 const DispatchQueueOffsets *dispatch_queue_offsets = GetDispatchQueueOffsets(); 2709 if (dispatch_queue_offsets) 2710 { 2711 std::string queue_name; 2712 uint64_t queue_width = 0; 2713 uint64_t queue_serialnum = 0; 2714 dispatch_queue_offsets->GetThreadQueueInfo(pid, thread_ident_info.dispatch_qaddr, queue_name, queue_width, queue_serialnum); 2715 if (!queue_name.empty()) 2716 { 2717 ostrm << "qname:"; 2718 append_hex_value(ostrm, queue_name.data(), queue_name.size(), false); 2719 ostrm << ';'; 2720 } 2721 if (queue_width == 1) 2722 ostrm << "qkind:serial;"; 2723 else if (queue_width > 1) 2724 ostrm << "qkind:concurrent;"; 2725 2726 if (queue_serialnum > 0) 2727 ostrm << "qserial:" << DECIMAL << queue_serialnum << ';'; 2728 } 2729 } 2730 } 2731 2732 // If a 'QListThreadsInStopReply' was sent to enable this feature, we 2733 // will send all thread IDs back in the "threads" key whose value is 2734 // a list of hex thread IDs separated by commas: 2735 // "threads:10a,10b,10c;" 2736 // This will save the debugger from having to send a pair of qfThreadInfo 2737 // and qsThreadInfo packets, but it also might take a lot of room in the 2738 // stop reply packet, so it must be enabled only on systems where there 2739 // are no limits on packet lengths. 2740 if (m_list_threads_in_stop_reply) 2741 { 2742 const nub_size_t numthreads = DNBProcessGetNumThreads (pid); 2743 if (numthreads > 0) 2744 { 2745 ostrm << std::hex << "threads:"; 2746 for (nub_size_t i = 0; i < numthreads; ++i) 2747 { 2748 nub_thread_t th = DNBProcessGetThreadAtIndex (pid, i); 2749 if (i > 0) 2750 ostrm << ','; 2751 ostrm << std::hex << th; 2752 } 2753 ostrm << ';'; 2754 } 2755 2756 // Include JSON info that describes the stop reason for any threads 2757 // that actually have stop reasons. We use the new "jstopinfo" key 2758 // whose values is hex ascii JSON that contains the thread IDs 2759 // thread stop info only for threads that have stop reasons. Only send 2760 // this if we have more than one thread otherwise this packet has all 2761 // the info it needs. 2762 if (numthreads > 1) 2763 { 2764 const bool threads_with_valid_stop_info_only = true; 2765 JSONGenerator::ObjectSP threads_info_sp = GetJSONThreadsInfo(threads_with_valid_stop_info_only); 2766 if (threads_info_sp) 2767 { 2768 ostrm << std::hex << "jstopinfo:"; 2769 std::ostringstream json_strm; 2770 threads_info_sp->Dump (json_strm); 2771 append_hexified_string (ostrm, json_strm.str()); 2772 ostrm << ';'; 2773 } 2774 } 2775 } 2776 2777 2778 if (g_num_reg_entries == 0) 2779 InitializeRegisters (); 2780 2781 if (g_reg_entries != NULL) 2782 { 2783 DNBRegisterValue reg_value; 2784 for (uint32_t reg = 0; reg < g_num_reg_entries; reg++) 2785 { 2786 // Expedite all registers in the first register set that aren't 2787 // contained in other registers 2788 if (g_reg_entries[reg].nub_info.set == 1 && 2789 g_reg_entries[reg].nub_info.value_regs == NULL) 2790 { 2791 if (!DNBThreadGetRegisterValueByID (pid, tid, g_reg_entries[reg].nub_info.set, g_reg_entries[reg].nub_info.reg, ®_value)) 2792 continue; 2793 2794 gdb_regnum_with_fixed_width_hex_register_value (ostrm, pid, tid, &g_reg_entries[reg], ®_value); 2795 } 2796 } 2797 } 2798 2799 if (did_exec) 2800 { 2801 ostrm << "reason:exec;"; 2802 } 2803 else if (tid_stop_info.details.exception.type) 2804 { 2805 ostrm << "metype:" << std::hex << tid_stop_info.details.exception.type << ';'; 2806 ostrm << "mecount:" << std::hex << tid_stop_info.details.exception.data_count << ';'; 2807 for (nub_size_t i = 0; i < tid_stop_info.details.exception.data_count; ++i) 2808 ostrm << "medata:" << std::hex << tid_stop_info.details.exception.data[i] << ';'; 2809 } 2810 2811 // Add expedited stack memory so stack backtracing doesn't need to read anything from the 2812 // frame pointer chain. 2813 StackMemoryMap stack_mmap; 2814 ReadStackMemory (pid, tid, stack_mmap, 1); 2815 if (!stack_mmap.empty()) 2816 { 2817 for (const auto &stack_memory : stack_mmap) 2818 { 2819 ostrm << "memory:" << HEXBASE << stack_memory.first << '='; 2820 append_hex_value (ostrm, stack_memory.second.bytes, stack_memory.second.length, false); 2821 ostrm << ';'; 2822 } 2823 } 2824 2825 return SendPacket (ostrm.str ()); 2826 } 2827 return SendPacket("E51"); 2828 } 2829 2830 /* '?' 2831 The stop reply packet - tell gdb what the status of the inferior is. 2832 Often called the questionmark_packet. */ 2833 2834 rnb_err_t 2835 RNBRemote::HandlePacket_last_signal (const char *unused) 2836 { 2837 if (!m_ctx.HasValidProcessID()) 2838 { 2839 // Inferior is not yet specified/running 2840 return SendPacket ("E02"); 2841 } 2842 2843 nub_process_t pid = m_ctx.ProcessID(); 2844 nub_state_t pid_state = DNBProcessGetState (pid); 2845 2846 switch (pid_state) 2847 { 2848 case eStateAttaching: 2849 case eStateLaunching: 2850 case eStateRunning: 2851 case eStateStepping: 2852 case eStateDetached: 2853 return rnb_success; // Ignore 2854 2855 case eStateSuspended: 2856 case eStateStopped: 2857 case eStateCrashed: 2858 { 2859 nub_thread_t tid = DNBProcessGetCurrentThread (pid); 2860 // Make sure we set the current thread so g and p packets return 2861 // the data the gdb will expect. 2862 SetCurrentThread (tid); 2863 2864 SendStopReplyPacketForThread (tid); 2865 } 2866 break; 2867 2868 case eStateInvalid: 2869 case eStateUnloaded: 2870 case eStateExited: 2871 { 2872 char pid_exited_packet[16] = ""; 2873 int pid_status = 0; 2874 // Process exited with exit status 2875 if (!DNBProcessGetExitStatus(pid, &pid_status)) 2876 pid_status = 0; 2877 2878 if (pid_status) 2879 { 2880 if (WIFEXITED (pid_status)) 2881 snprintf (pid_exited_packet, sizeof(pid_exited_packet), "W%02x", WEXITSTATUS (pid_status)); 2882 else if (WIFSIGNALED (pid_status)) 2883 snprintf (pid_exited_packet, sizeof(pid_exited_packet), "X%02x", WEXITSTATUS (pid_status)); 2884 else if (WIFSTOPPED (pid_status)) 2885 snprintf (pid_exited_packet, sizeof(pid_exited_packet), "S%02x", WSTOPSIG (pid_status)); 2886 } 2887 2888 // If we have an empty exit packet, lets fill one in to be safe. 2889 if (!pid_exited_packet[0]) 2890 { 2891 strncpy (pid_exited_packet, "W00", sizeof(pid_exited_packet)-1); 2892 pid_exited_packet[sizeof(pid_exited_packet)-1] = '\0'; 2893 } 2894 2895 const char *exit_info = DNBProcessGetExitInfo (pid); 2896 if (exit_info != NULL && *exit_info != '\0') 2897 { 2898 std::ostringstream exit_packet; 2899 exit_packet << pid_exited_packet; 2900 exit_packet << ';'; 2901 exit_packet << RAW_HEXBASE << "description"; 2902 exit_packet << ':'; 2903 for (size_t i = 0; exit_info[i] != '\0'; i++) 2904 exit_packet << RAWHEX8(exit_info[i]); 2905 exit_packet << ';'; 2906 return SendPacket (exit_packet.str()); 2907 } 2908 else 2909 return SendPacket (pid_exited_packet); 2910 } 2911 break; 2912 } 2913 return rnb_success; 2914 } 2915 2916 rnb_err_t 2917 RNBRemote::HandlePacket_M (const char *p) 2918 { 2919 if (p == NULL || p[0] == '\0' || strlen (p) < 3) 2920 { 2921 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Too short M packet"); 2922 } 2923 2924 char *c; 2925 p++; 2926 errno = 0; 2927 nub_addr_t addr = strtoull (p, &c, 16); 2928 if (errno != 0 && addr == 0) 2929 { 2930 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Invalid address in M packet"); 2931 } 2932 if (*c != ',') 2933 { 2934 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Comma sep missing in M packet"); 2935 } 2936 2937 /* Advance 'p' to the length part of the packet. */ 2938 p += (c - p) + 1; 2939 2940 errno = 0; 2941 unsigned long length = strtoul (p, &c, 16); 2942 if (errno != 0 && length == 0) 2943 { 2944 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Invalid length in M packet"); 2945 } 2946 if (length == 0) 2947 { 2948 return SendPacket ("OK"); 2949 } 2950 2951 if (*c != ':') 2952 { 2953 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Missing colon in M packet"); 2954 } 2955 /* Advance 'p' to the data part of the packet. */ 2956 p += (c - p) + 1; 2957 2958 size_t datalen = strlen (p); 2959 if (datalen & 0x1) 2960 { 2961 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Uneven # of hex chars for data in M packet"); 2962 } 2963 if (datalen == 0) 2964 { 2965 return SendPacket ("OK"); 2966 } 2967 2968 uint8_t *buf = (uint8_t *) alloca (datalen / 2); 2969 uint8_t *i = buf; 2970 2971 while (*p != '\0' && *(p + 1) != '\0') 2972 { 2973 char hexbuf[3]; 2974 hexbuf[0] = *p; 2975 hexbuf[1] = *(p + 1); 2976 hexbuf[2] = '\0'; 2977 errno = 0; 2978 uint8_t byte = strtoul (hexbuf, NULL, 16); 2979 if (errno != 0 && byte == 0) 2980 { 2981 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Invalid hex byte in M packet"); 2982 } 2983 *i++ = byte; 2984 p += 2; 2985 } 2986 2987 nub_size_t wrote = DNBProcessMemoryWrite (m_ctx.ProcessID(), addr, length, buf); 2988 if (wrote != length) 2989 return SendPacket ("E09"); 2990 else 2991 return SendPacket ("OK"); 2992 } 2993 2994 2995 rnb_err_t 2996 RNBRemote::HandlePacket_m (const char *p) 2997 { 2998 if (p == NULL || p[0] == '\0' || strlen (p) < 3) 2999 { 3000 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Too short m packet"); 3001 } 3002 3003 char *c; 3004 p++; 3005 errno = 0; 3006 nub_addr_t addr = strtoull (p, &c, 16); 3007 if (errno != 0 && addr == 0) 3008 { 3009 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Invalid address in m packet"); 3010 } 3011 if (*c != ',') 3012 { 3013 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Comma sep missing in m packet"); 3014 } 3015 3016 /* Advance 'p' to the length part of the packet. */ 3017 p += (c - p) + 1; 3018 3019 errno = 0; 3020 auto length = strtoul (p, NULL, 16); 3021 if (errno != 0 && length == 0) 3022 { 3023 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Invalid length in m packet"); 3024 } 3025 if (length == 0) 3026 { 3027 return SendPacket (""); 3028 } 3029 3030 std::string buf(length, '\0'); 3031 if (buf.empty()) 3032 { 3033 return SendPacket ("E78"); 3034 } 3035 nub_size_t bytes_read = DNBProcessMemoryRead (m_ctx.ProcessID(), addr, buf.size(), &buf[0]); 3036 if (bytes_read == 0) 3037 { 3038 return SendPacket ("E08"); 3039 } 3040 3041 // "The reply may contain fewer bytes than requested if the server was able 3042 // to read only part of the region of memory." 3043 length = bytes_read; 3044 3045 std::ostringstream ostrm; 3046 for (unsigned long i = 0; i < length; i++) 3047 ostrm << RAWHEX8(buf[i]); 3048 return SendPacket (ostrm.str ()); 3049 } 3050 3051 // Read memory, sent it up as binary data. 3052 // Usage: xADDR,LEN 3053 // ADDR and LEN are both base 16. 3054 3055 // Responds with 'OK' for zero-length request 3056 // or 3057 // 3058 // DATA 3059 // 3060 // where DATA is the binary data payload. 3061 3062 rnb_err_t 3063 RNBRemote::HandlePacket_x (const char *p) 3064 { 3065 if (p == NULL || p[0] == '\0' || strlen (p) < 3) 3066 { 3067 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Too short X packet"); 3068 } 3069 3070 char *c; 3071 p++; 3072 errno = 0; 3073 nub_addr_t addr = strtoull (p, &c, 16); 3074 if (errno != 0) 3075 { 3076 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Invalid address in X packet"); 3077 } 3078 if (*c != ',') 3079 { 3080 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Comma sep missing in X packet"); 3081 } 3082 3083 /* Advance 'p' to the number of bytes to be read. */ 3084 p += (c - p) + 1; 3085 3086 errno = 0; 3087 auto length = strtoul (p, NULL, 16); 3088 if (errno != 0) 3089 { 3090 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Invalid length in x packet"); 3091 } 3092 3093 // zero length read means this is a test of whether that packet is implemented or not. 3094 if (length == 0) 3095 { 3096 return SendPacket ("OK"); 3097 } 3098 3099 std::vector<uint8_t> buf (length); 3100 3101 if (buf.capacity() != length) 3102 { 3103 return SendPacket ("E79"); 3104 } 3105 nub_size_t bytes_read = DNBProcessMemoryRead (m_ctx.ProcessID(), addr, buf.size(), &buf[0]); 3106 if (bytes_read == 0) 3107 { 3108 return SendPacket ("E80"); 3109 } 3110 3111 std::vector<uint8_t> buf_quoted; 3112 buf_quoted.reserve (bytes_read + 30); 3113 for (nub_size_t i = 0; i < bytes_read; i++) 3114 { 3115 if (buf[i] == '#' || buf[i] == '$' || buf[i] == '}' || buf[i] == '*') 3116 { 3117 buf_quoted.push_back(0x7d); 3118 buf_quoted.push_back(buf[i] ^ 0x20); 3119 } 3120 else 3121 { 3122 buf_quoted.push_back(buf[i]); 3123 } 3124 } 3125 length = buf_quoted.size(); 3126 3127 std::ostringstream ostrm; 3128 for (unsigned long i = 0; i < length; i++) 3129 ostrm << buf_quoted[i]; 3130 3131 return SendPacket (ostrm.str ()); 3132 } 3133 3134 rnb_err_t 3135 RNBRemote::HandlePacket_X (const char *p) 3136 { 3137 if (p == NULL || p[0] == '\0' || strlen (p) < 3) 3138 { 3139 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Too short X packet"); 3140 } 3141 3142 char *c; 3143 p++; 3144 errno = 0; 3145 nub_addr_t addr = strtoull (p, &c, 16); 3146 if (errno != 0 && addr == 0) 3147 { 3148 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Invalid address in X packet"); 3149 } 3150 if (*c != ',') 3151 { 3152 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Comma sep missing in X packet"); 3153 } 3154 3155 /* Advance 'p' to the length part of the packet. NB this is the length of the packet 3156 including any escaped chars. The data payload may be a little bit smaller after 3157 decoding. */ 3158 p += (c - p) + 1; 3159 3160 errno = 0; 3161 auto length = strtoul (p, NULL, 16); 3162 if (errno != 0 && length == 0) 3163 { 3164 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Invalid length in X packet"); 3165 } 3166 3167 // I think gdb sends a zero length write request to test whether this 3168 // packet is accepted. 3169 if (length == 0) 3170 { 3171 return SendPacket ("OK"); 3172 } 3173 3174 std::vector<uint8_t> data = decode_binary_data (c, -1); 3175 std::vector<uint8_t>::const_iterator it; 3176 uint8_t *buf = (uint8_t *) alloca (data.size ()); 3177 uint8_t *i = buf; 3178 for (it = data.begin (); it != data.end (); ++it) 3179 { 3180 *i++ = *it; 3181 } 3182 3183 nub_size_t wrote = DNBProcessMemoryWrite (m_ctx.ProcessID(), addr, data.size(), buf); 3184 if (wrote != data.size ()) 3185 return SendPacket ("E08"); 3186 return SendPacket ("OK"); 3187 } 3188 3189 /* 'g' -- read registers 3190 Get the contents of the registers for the current thread, 3191 send them to gdb. 3192 Should the setting of the Hg packet determine which thread's registers 3193 are returned? */ 3194 3195 rnb_err_t 3196 RNBRemote::HandlePacket_g (const char *p) 3197 { 3198 std::ostringstream ostrm; 3199 if (!m_ctx.HasValidProcessID()) 3200 { 3201 return SendPacket ("E11"); 3202 } 3203 3204 if (g_num_reg_entries == 0) 3205 InitializeRegisters (); 3206 3207 nub_process_t pid = m_ctx.ProcessID (); 3208 nub_thread_t tid = ExtractThreadIDFromThreadSuffix (p + 1); 3209 if (tid == INVALID_NUB_THREAD) 3210 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "No thread specified in p packet"); 3211 3212 // Get the register context size first by calling with NULL buffer 3213 nub_size_t reg_ctx_size = DNBThreadGetRegisterContext(pid, tid, NULL, 0); 3214 if (reg_ctx_size) 3215 { 3216 // Now allocate enough space for the entire register context 3217 std::vector<uint8_t> reg_ctx; 3218 reg_ctx.resize(reg_ctx_size); 3219 // Now read the register context 3220 reg_ctx_size = DNBThreadGetRegisterContext(pid, tid, ®_ctx[0], reg_ctx.size()); 3221 if (reg_ctx_size) 3222 { 3223 append_hex_value (ostrm, reg_ctx.data(), reg_ctx.size(), false); 3224 return SendPacket (ostrm.str ()); 3225 } 3226 } 3227 return SendPacket ("E74"); 3228 } 3229 3230 /* 'G XXX...' -- write registers 3231 How is the thread for these specified, beyond "the current thread"? 3232 Does gdb actually use the Hg packet to set this? */ 3233 3234 rnb_err_t 3235 RNBRemote::HandlePacket_G (const char *p) 3236 { 3237 if (!m_ctx.HasValidProcessID()) 3238 { 3239 return SendPacket ("E11"); 3240 } 3241 3242 if (g_num_reg_entries == 0) 3243 InitializeRegisters (); 3244 3245 StringExtractor packet(p); 3246 packet.SetFilePos(1); // Skip the 'G' 3247 3248 nub_process_t pid = m_ctx.ProcessID(); 3249 nub_thread_t tid = ExtractThreadIDFromThreadSuffix (p); 3250 if (tid == INVALID_NUB_THREAD) 3251 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "No thread specified in p packet"); 3252 3253 // Get the register context size first by calling with NULL buffer 3254 nub_size_t reg_ctx_size = DNBThreadGetRegisterContext(pid, tid, NULL, 0); 3255 if (reg_ctx_size) 3256 { 3257 // Now allocate enough space for the entire register context 3258 std::vector<uint8_t> reg_ctx; 3259 reg_ctx.resize(reg_ctx_size); 3260 3261 const nub_size_t bytes_extracted = packet.GetHexBytes (®_ctx[0], reg_ctx.size(), 0xcc); 3262 if (bytes_extracted == reg_ctx.size()) 3263 { 3264 // Now write the register context 3265 reg_ctx_size = DNBThreadSetRegisterContext(pid, tid, reg_ctx.data(), reg_ctx.size()); 3266 if (reg_ctx_size == reg_ctx.size()) 3267 return SendPacket ("OK"); 3268 else 3269 return SendPacket ("E55"); 3270 } 3271 else 3272 { 3273 DNBLogError("RNBRemote::HandlePacket_G(%s): extracted %llu of %llu bytes, size mismatch\n", p, (uint64_t)bytes_extracted, (uint64_t)reg_ctx_size); 3274 return SendPacket ("E64"); 3275 } 3276 } 3277 return SendPacket ("E65"); 3278 } 3279 3280 static bool 3281 RNBRemoteShouldCancelCallback (void *not_used) 3282 { 3283 RNBRemoteSP remoteSP(g_remoteSP); 3284 if (remoteSP.get() != NULL) 3285 { 3286 RNBRemote* remote = remoteSP.get(); 3287 if (remote->Comm().IsConnected()) 3288 return false; 3289 else 3290 return true; 3291 } 3292 return true; 3293 } 3294 3295 3296 // FORMAT: _MXXXXXX,PPP 3297 // XXXXXX: big endian hex chars 3298 // PPP: permissions can be any combo of r w x chars 3299 // 3300 // RESPONSE: XXXXXX 3301 // XXXXXX: hex address of the newly allocated memory 3302 // EXX: error code 3303 // 3304 // EXAMPLES: 3305 // _M123000,rw 3306 // _M123000,rwx 3307 // _M123000,xw 3308 3309 rnb_err_t 3310 RNBRemote::HandlePacket_AllocateMemory (const char *p) 3311 { 3312 StringExtractor packet (p); 3313 packet.SetFilePos(2); // Skip the "_M" 3314 3315 nub_addr_t size = packet.GetHexMaxU64 (StringExtractor::BigEndian, 0); 3316 if (size != 0) 3317 { 3318 if (packet.GetChar() == ',') 3319 { 3320 uint32_t permissions = 0; 3321 char ch; 3322 bool success = true; 3323 while (success && (ch = packet.GetChar()) != '\0') 3324 { 3325 switch (ch) 3326 { 3327 case 'r': permissions |= eMemoryPermissionsReadable; break; 3328 case 'w': permissions |= eMemoryPermissionsWritable; break; 3329 case 'x': permissions |= eMemoryPermissionsExecutable; break; 3330 default: success = false; break; 3331 } 3332 } 3333 3334 if (success) 3335 { 3336 nub_addr_t addr = DNBProcessMemoryAllocate (m_ctx.ProcessID(), size, permissions); 3337 if (addr != INVALID_NUB_ADDRESS) 3338 { 3339 std::ostringstream ostrm; 3340 ostrm << RAW_HEXBASE << addr; 3341 return SendPacket (ostrm.str ()); 3342 } 3343 } 3344 } 3345 } 3346 return SendPacket ("E53"); 3347 } 3348 3349 // FORMAT: _mXXXXXX 3350 // XXXXXX: address that was previously allocated 3351 // 3352 // RESPONSE: XXXXXX 3353 // OK: address was deallocated 3354 // EXX: error code 3355 // 3356 // EXAMPLES: 3357 // _m123000 3358 3359 rnb_err_t 3360 RNBRemote::HandlePacket_DeallocateMemory (const char *p) 3361 { 3362 StringExtractor packet (p); 3363 packet.SetFilePos(2); // Skip the "_m" 3364 nub_addr_t addr = packet.GetHexMaxU64 (StringExtractor::BigEndian, INVALID_NUB_ADDRESS); 3365 3366 if (addr != INVALID_NUB_ADDRESS) 3367 { 3368 if (DNBProcessMemoryDeallocate (m_ctx.ProcessID(), addr)) 3369 return SendPacket ("OK"); 3370 } 3371 return SendPacket ("E54"); 3372 } 3373 3374 3375 // FORMAT: QSaveRegisterState;thread:TTTT; (when thread suffix is supported) 3376 // FORMAT: QSaveRegisterState (when thread suffix is NOT supported) 3377 // TTTT: thread ID in hex 3378 // 3379 // RESPONSE: 3380 // SAVEID: Where SAVEID is a decimal number that represents the save ID 3381 // that can be passed back into a "QRestoreRegisterState" packet 3382 // EXX: error code 3383 // 3384 // EXAMPLES: 3385 // QSaveRegisterState;thread:1E34; (when thread suffix is supported) 3386 // QSaveRegisterState (when thread suffix is NOT supported) 3387 3388 rnb_err_t 3389 RNBRemote::HandlePacket_SaveRegisterState (const char *p) 3390 { 3391 nub_process_t pid = m_ctx.ProcessID (); 3392 nub_thread_t tid = ExtractThreadIDFromThreadSuffix (p); 3393 if (tid == INVALID_NUB_THREAD) 3394 { 3395 if (m_thread_suffix_supported) 3396 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "No thread specified in QSaveRegisterState packet"); 3397 else 3398 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "No thread was is set with the Hg packet"); 3399 } 3400 3401 // Get the register context size first by calling with NULL buffer 3402 const uint32_t save_id = DNBThreadSaveRegisterState(pid, tid); 3403 if (save_id != 0) 3404 { 3405 char response[64]; 3406 snprintf (response, sizeof(response), "%u", save_id); 3407 return SendPacket (response); 3408 } 3409 else 3410 { 3411 return SendPacket ("E75"); 3412 } 3413 } 3414 // FORMAT: QRestoreRegisterState:SAVEID;thread:TTTT; (when thread suffix is supported) 3415 // FORMAT: QRestoreRegisterState:SAVEID (when thread suffix is NOT supported) 3416 // TTTT: thread ID in hex 3417 // SAVEID: a decimal number that represents the save ID that was 3418 // returned from a call to "QSaveRegisterState" 3419 // 3420 // RESPONSE: 3421 // OK: successfully restored registers for the specified thread 3422 // EXX: error code 3423 // 3424 // EXAMPLES: 3425 // QRestoreRegisterState:1;thread:1E34; (when thread suffix is supported) 3426 // QRestoreRegisterState:1 (when thread suffix is NOT supported) 3427 3428 rnb_err_t 3429 RNBRemote::HandlePacket_RestoreRegisterState (const char *p) 3430 { 3431 nub_process_t pid = m_ctx.ProcessID (); 3432 nub_thread_t tid = ExtractThreadIDFromThreadSuffix (p); 3433 if (tid == INVALID_NUB_THREAD) 3434 { 3435 if (m_thread_suffix_supported) 3436 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "No thread specified in QSaveRegisterState packet"); 3437 else 3438 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "No thread was is set with the Hg packet"); 3439 } 3440 3441 StringExtractor packet (p); 3442 packet.SetFilePos(strlen("QRestoreRegisterState:")); // Skip the "QRestoreRegisterState:" 3443 const uint32_t save_id = packet.GetU32(0); 3444 3445 if (save_id != 0) 3446 { 3447 // Get the register context size first by calling with NULL buffer 3448 if (DNBThreadRestoreRegisterState(pid, tid, save_id)) 3449 return SendPacket ("OK"); 3450 else 3451 return SendPacket ("E77"); 3452 } 3453 return SendPacket ("E76"); 3454 } 3455 3456 static bool 3457 GetProcessNameFrom_vAttach (const char *&p, std::string &attach_name) 3458 { 3459 bool return_val = true; 3460 while (*p != '\0') 3461 { 3462 char smallbuf[3]; 3463 smallbuf[0] = *p; 3464 smallbuf[1] = *(p + 1); 3465 smallbuf[2] = '\0'; 3466 3467 errno = 0; 3468 int ch = static_cast<int>(strtoul (smallbuf, NULL, 16)); 3469 if (errno != 0 && ch == 0) 3470 { 3471 return_val = false; 3472 break; 3473 } 3474 3475 attach_name.push_back(ch); 3476 p += 2; 3477 } 3478 return return_val; 3479 } 3480 3481 rnb_err_t 3482 RNBRemote::HandlePacket_qSupported (const char *p) 3483 { 3484 uint32_t max_packet_size = 128 * 1024; // 128KBytes is a reasonable max packet size--debugger can always use less 3485 char buf[256]; 3486 snprintf (buf, sizeof(buf), "qXfer:features:read+;PacketSize=%x;qEcho+", max_packet_size); 3487 3488 // By default, don't enable compression. It's only worth doing when we are working 3489 // with a low speed communication channel. 3490 bool enable_compression = false; 3491 (void)enable_compression; 3492 3493 // Enable compression when debugserver is running on a watchOS device where communication may be over Bluetooth. 3494 #if defined (TARGET_OS_WATCH) && TARGET_OS_WATCH == 1 3495 enable_compression = true; 3496 #endif 3497 3498 #if defined (HAVE_LIBCOMPRESSION) 3499 // libcompression is weak linked so test if compression_decode_buffer() is available 3500 if (enable_compression && compression_decode_buffer != NULL) 3501 { 3502 strcat (buf, ";SupportedCompressions=lzfse,zlib-deflate,lz4,lzma;DefaultCompressionMinSize="); 3503 char numbuf[16]; 3504 snprintf (numbuf, sizeof (numbuf), "%zu", m_compression_minsize); 3505 numbuf[sizeof (numbuf) - 1] = '\0'; 3506 strcat (buf, numbuf); 3507 } 3508 #elif defined (HAVE_LIBZ) 3509 if (enable_compression) 3510 { 3511 strcat (buf, ";SupportedCompressions=zlib-deflate;DefaultCompressionMinSize="); 3512 char numbuf[16]; 3513 snprintf (numbuf, sizeof (numbuf), "%zu", m_compression_minsize); 3514 numbuf[sizeof (numbuf) - 1] = '\0'; 3515 strcat (buf, numbuf); 3516 } 3517 #endif 3518 3519 return SendPacket (buf); 3520 } 3521 3522 /* 3523 vAttach;pid 3524 3525 Attach to a new process with the specified process ID. pid is a hexadecimal integer 3526 identifying the process. If the stub is currently controlling a process, it is 3527 killed. The attached process is stopped.This packet is only available in extended 3528 mode (see extended mode). 3529 3530 Reply: 3531 "ENN" for an error 3532 "Any Stop Reply Packet" for success 3533 */ 3534 3535 rnb_err_t 3536 RNBRemote::HandlePacket_v (const char *p) 3537 { 3538 if (strcmp (p, "vCont;c") == 0) 3539 { 3540 // Simple continue 3541 return RNBRemote::HandlePacket_c("c"); 3542 } 3543 else if (strcmp (p, "vCont;s") == 0) 3544 { 3545 // Simple step 3546 return RNBRemote::HandlePacket_s("s"); 3547 } 3548 else if (strstr (p, "vCont") == p) 3549 { 3550 typedef struct 3551 { 3552 nub_thread_t tid; 3553 char action; 3554 int signal; 3555 } vcont_action_t; 3556 3557 DNBThreadResumeActions thread_actions; 3558 char *c = (char *)(p += strlen("vCont")); 3559 char *c_end = c + strlen(c); 3560 if (*c == '?') 3561 return SendPacket ("vCont;c;C;s;S"); 3562 3563 while (c < c_end && *c == ';') 3564 { 3565 ++c; // Skip the semi-colon 3566 DNBThreadResumeAction thread_action; 3567 thread_action.tid = INVALID_NUB_THREAD; 3568 thread_action.state = eStateInvalid; 3569 thread_action.signal = 0; 3570 thread_action.addr = INVALID_NUB_ADDRESS; 3571 3572 char action = *c++; 3573 3574 switch (action) 3575 { 3576 case 'C': 3577 errno = 0; 3578 thread_action.signal = static_cast<int>(strtoul (c, &c, 16)); 3579 if (errno != 0) 3580 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Could not parse signal in vCont packet"); 3581 // Fall through to next case... 3582 3583 case 'c': 3584 // Continue 3585 thread_action.state = eStateRunning; 3586 break; 3587 3588 case 'S': 3589 errno = 0; 3590 thread_action.signal = static_cast<int>(strtoul (c, &c, 16)); 3591 if (errno != 0) 3592 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Could not parse signal in vCont packet"); 3593 // Fall through to next case... 3594 3595 case 's': 3596 // Step 3597 thread_action.state = eStateStepping; 3598 break; 3599 3600 default: 3601 HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Unsupported action in vCont packet"); 3602 break; 3603 } 3604 if (*c == ':') 3605 { 3606 errno = 0; 3607 thread_action.tid = strtoul (++c, &c, 16); 3608 if (errno != 0) 3609 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Could not parse thread number in vCont packet"); 3610 } 3611 3612 thread_actions.Append (thread_action); 3613 } 3614 3615 // If a default action for all other threads wasn't mentioned 3616 // then we should stop the threads 3617 thread_actions.SetDefaultThreadActionIfNeeded (eStateStopped, 0); 3618 DNBProcessResume(m_ctx.ProcessID(), thread_actions.GetFirst (), thread_actions.GetSize()); 3619 return rnb_success; 3620 } 3621 else if (strstr (p, "vAttach") == p) 3622 { 3623 nub_process_t attach_pid = INVALID_NUB_PROCESS; // attach_pid will be set to 0 if the attach fails 3624 nub_process_t pid_attaching_to = INVALID_NUB_PROCESS; // pid_attaching_to is the original pid specified 3625 char err_str[1024]={'\0'}; 3626 std::string attach_name; 3627 3628 if (strstr (p, "vAttachWait;") == p) 3629 { 3630 p += strlen("vAttachWait;"); 3631 if (!GetProcessNameFrom_vAttach(p, attach_name)) 3632 { 3633 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "non-hex char in arg on 'vAttachWait' pkt"); 3634 } 3635 const bool ignore_existing = true; 3636 attach_pid = DNBProcessAttachWait(attach_name.c_str (), m_ctx.LaunchFlavor(), ignore_existing, NULL, 1000, err_str, sizeof(err_str), RNBRemoteShouldCancelCallback); 3637 3638 } 3639 else if (strstr (p, "vAttachOrWait;") == p) 3640 { 3641 p += strlen("vAttachOrWait;"); 3642 if (!GetProcessNameFrom_vAttach(p, attach_name)) 3643 { 3644 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "non-hex char in arg on 'vAttachOrWait' pkt"); 3645 } 3646 const bool ignore_existing = false; 3647 attach_pid = DNBProcessAttachWait(attach_name.c_str (), m_ctx.LaunchFlavor(), ignore_existing, NULL, 1000, err_str, sizeof(err_str), RNBRemoteShouldCancelCallback); 3648 } 3649 else if (strstr (p, "vAttachName;") == p) 3650 { 3651 p += strlen("vAttachName;"); 3652 if (!GetProcessNameFrom_vAttach(p, attach_name)) 3653 { 3654 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "non-hex char in arg on 'vAttachName' pkt"); 3655 } 3656 3657 attach_pid = DNBProcessAttachByName (attach_name.c_str(), NULL, err_str, sizeof(err_str)); 3658 3659 } 3660 else if (strstr (p, "vAttach;") == p) 3661 { 3662 p += strlen("vAttach;"); 3663 char *end = NULL; 3664 pid_attaching_to = static_cast<int>(strtoul (p, &end, 16)); // PID will be in hex, so use base 16 to decode 3665 if (p != end && *end == '\0') 3666 { 3667 // Wait at most 30 second for attach 3668 struct timespec attach_timeout_abstime; 3669 DNBTimer::OffsetTimeOfDay(&attach_timeout_abstime, 30, 0); 3670 attach_pid = DNBProcessAttach(pid_attaching_to, &attach_timeout_abstime, err_str, sizeof(err_str)); 3671 } 3672 } 3673 else 3674 { 3675 return HandlePacket_UNIMPLEMENTED(p); 3676 } 3677 3678 3679 if (attach_pid != INVALID_NUB_PROCESS) 3680 { 3681 if (m_ctx.ProcessID() != attach_pid) 3682 m_ctx.SetProcessID(attach_pid); 3683 // Send a stop reply packet to indicate we successfully attached! 3684 NotifyThatProcessStopped (); 3685 return rnb_success; 3686 } 3687 else 3688 { 3689 m_ctx.LaunchStatus().SetError(-1, DNBError::Generic); 3690 if (err_str[0]) 3691 m_ctx.LaunchStatus().SetErrorString(err_str); 3692 else 3693 m_ctx.LaunchStatus().SetErrorString("attach failed"); 3694 3695 #if defined (__APPLE__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 101000) 3696 if (pid_attaching_to == INVALID_NUB_PROCESS && !attach_name.empty()) 3697 { 3698 pid_attaching_to = DNBProcessGetPIDByName (attach_name.c_str()); 3699 } 3700 if (pid_attaching_to != INVALID_NUB_PROCESS && strcmp (err_str, "No such process") != 0) 3701 { 3702 // csr_check(CSR_ALLOW_TASK_FOR_PID) will be nonzero if System Integrity Protection is in effect. 3703 if (csr_check(CSR_ALLOW_TASK_FOR_PID) != 0) 3704 { 3705 bool attach_failed_due_to_sip = false; 3706 3707 if (rootless_allows_task_for_pid (pid_attaching_to) == 0) 3708 { 3709 attach_failed_due_to_sip = true; 3710 } 3711 3712 if (attach_failed_due_to_sip == false) 3713 { 3714 int csops_flags = 0; 3715 int retval = ::csops (pid_attaching_to, CS_OPS_STATUS, &csops_flags, sizeof (csops_flags)); 3716 if (retval != -1 && (csops_flags & CS_RESTRICT)) 3717 { 3718 attach_failed_due_to_sip = true; 3719 } 3720 } 3721 if (attach_failed_due_to_sip) 3722 { 3723 SendPacket ("E87"); // E87 is the magic value which says that we are not allowed to attach 3724 DNBLogError ("Attach failed because process does not allow attaching: \"%s\".", err_str); 3725 return rnb_err; 3726 } 3727 } 3728 } 3729 3730 #endif 3731 3732 SendPacket ("E01"); // E01 is our magic error value for attach failed. 3733 DNBLogError ("Attach failed: \"%s\".", err_str); 3734 return rnb_err; 3735 } 3736 } 3737 3738 // All other failures come through here 3739 return HandlePacket_UNIMPLEMENTED(p); 3740 } 3741 3742 /* 'T XX' -- status of thread 3743 Check if the specified thread is alive. 3744 The thread number is in hex? */ 3745 3746 rnb_err_t 3747 RNBRemote::HandlePacket_T (const char *p) 3748 { 3749 p++; 3750 if (p == NULL || *p == '\0') 3751 { 3752 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "No thread specified in T packet"); 3753 } 3754 if (!m_ctx.HasValidProcessID()) 3755 { 3756 return SendPacket ("E15"); 3757 } 3758 errno = 0; 3759 nub_thread_t tid = strtoul (p, NULL, 16); 3760 if (errno != 0 && tid == 0) 3761 { 3762 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Could not parse thread number in T packet"); 3763 } 3764 3765 nub_state_t state = DNBThreadGetState (m_ctx.ProcessID(), tid); 3766 if (state == eStateInvalid || state == eStateExited || state == eStateCrashed) 3767 { 3768 return SendPacket ("E16"); 3769 } 3770 3771 return SendPacket ("OK"); 3772 } 3773 3774 3775 rnb_err_t 3776 RNBRemote::HandlePacket_z (const char *p) 3777 { 3778 if (p == NULL || *p == '\0') 3779 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "No thread specified in z packet"); 3780 3781 if (!m_ctx.HasValidProcessID()) 3782 return SendPacket ("E15"); 3783 3784 char packet_cmd = *p++; 3785 char break_type = *p++; 3786 3787 if (*p++ != ',') 3788 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Comma separator missing in z packet"); 3789 3790 char *c = NULL; 3791 nub_process_t pid = m_ctx.ProcessID(); 3792 errno = 0; 3793 nub_addr_t addr = strtoull (p, &c, 16); 3794 if (errno != 0 && addr == 0) 3795 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Invalid address in z packet"); 3796 p = c; 3797 if (*p++ != ',') 3798 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Comma separator missing in z packet"); 3799 3800 errno = 0; 3801 auto byte_size = strtoul (p, &c, 16); 3802 if (errno != 0 && byte_size == 0) 3803 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Invalid length in z packet"); 3804 3805 if (packet_cmd == 'Z') 3806 { 3807 // set 3808 switch (break_type) 3809 { 3810 case '0': // set software breakpoint 3811 case '1': // set hardware breakpoint 3812 { 3813 // gdb can send multiple Z packets for the same address and 3814 // these calls must be ref counted. 3815 bool hardware = (break_type == '1'); 3816 3817 if (DNBBreakpointSet (pid, addr, byte_size, hardware)) 3818 { 3819 // We successfully created a breakpoint, now lets full out 3820 // a ref count structure with the breakID and add it to our 3821 // map. 3822 return SendPacket ("OK"); 3823 } 3824 else 3825 { 3826 // We failed to set the software breakpoint 3827 return SendPacket ("E09"); 3828 } 3829 } 3830 break; 3831 3832 case '2': // set write watchpoint 3833 case '3': // set read watchpoint 3834 case '4': // set access watchpoint 3835 { 3836 bool hardware = true; 3837 uint32_t watch_flags = 0; 3838 if (break_type == '2') 3839 watch_flags = WATCH_TYPE_WRITE; 3840 else if (break_type == '3') 3841 watch_flags = WATCH_TYPE_READ; 3842 else 3843 watch_flags = WATCH_TYPE_READ | WATCH_TYPE_WRITE; 3844 3845 if (DNBWatchpointSet (pid, addr, byte_size, watch_flags, hardware)) 3846 { 3847 return SendPacket ("OK"); 3848 } 3849 else 3850 { 3851 // We failed to set the watchpoint 3852 return SendPacket ("E09"); 3853 } 3854 } 3855 break; 3856 3857 default: 3858 break; 3859 } 3860 } 3861 else if (packet_cmd == 'z') 3862 { 3863 // remove 3864 switch (break_type) 3865 { 3866 case '0': // remove software breakpoint 3867 case '1': // remove hardware breakpoint 3868 if (DNBBreakpointClear (pid, addr)) 3869 { 3870 return SendPacket ("OK"); 3871 } 3872 else 3873 { 3874 return SendPacket ("E08"); 3875 } 3876 break; 3877 3878 case '2': // remove write watchpoint 3879 case '3': // remove read watchpoint 3880 case '4': // remove access watchpoint 3881 if (DNBWatchpointClear (pid, addr)) 3882 { 3883 return SendPacket ("OK"); 3884 } 3885 else 3886 { 3887 return SendPacket ("E08"); 3888 } 3889 break; 3890 3891 default: 3892 break; 3893 } 3894 } 3895 return HandlePacket_UNIMPLEMENTED(p); 3896 } 3897 3898 // Extract the thread number from the thread suffix that might be appended to 3899 // thread specific packets. This will only be enabled if m_thread_suffix_supported 3900 // is true. 3901 nub_thread_t 3902 RNBRemote::ExtractThreadIDFromThreadSuffix (const char *p) 3903 { 3904 if (m_thread_suffix_supported) 3905 { 3906 nub_thread_t tid = INVALID_NUB_THREAD; 3907 if (p) 3908 { 3909 const char *tid_cstr = strstr (p, "thread:"); 3910 if (tid_cstr) 3911 { 3912 tid_cstr += strlen ("thread:"); 3913 tid = strtoul(tid_cstr, NULL, 16); 3914 } 3915 } 3916 return tid; 3917 } 3918 return GetCurrentThread(); 3919 3920 } 3921 3922 /* 'p XX' 3923 print the contents of register X */ 3924 3925 rnb_err_t 3926 RNBRemote::HandlePacket_p (const char *p) 3927 { 3928 if (g_num_reg_entries == 0) 3929 InitializeRegisters (); 3930 3931 if (p == NULL || *p == '\0') 3932 { 3933 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "No thread specified in p packet"); 3934 } 3935 if (!m_ctx.HasValidProcessID()) 3936 { 3937 return SendPacket ("E15"); 3938 } 3939 nub_process_t pid = m_ctx.ProcessID(); 3940 errno = 0; 3941 char *tid_cstr = NULL; 3942 uint32_t reg = static_cast<uint32_t>(strtoul (p + 1, &tid_cstr, 16)); 3943 if (errno != 0 && reg == 0) 3944 { 3945 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Could not parse register number in p packet"); 3946 } 3947 3948 nub_thread_t tid = ExtractThreadIDFromThreadSuffix (tid_cstr); 3949 if (tid == INVALID_NUB_THREAD) 3950 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "No thread specified in p packet"); 3951 3952 const register_map_entry_t *reg_entry; 3953 3954 if (reg < g_num_reg_entries) 3955 reg_entry = &g_reg_entries[reg]; 3956 else 3957 reg_entry = NULL; 3958 3959 std::ostringstream ostrm; 3960 if (reg_entry == NULL) 3961 { 3962 DNBLogError("RNBRemote::HandlePacket_p(%s): unknown register number %u requested\n", p, reg); 3963 ostrm << "00000000"; 3964 } 3965 else if (reg_entry->nub_info.reg == (uint32_t)-1) 3966 { 3967 if (reg_entry->nub_info.size > 0) 3968 { 3969 std::basic_string<uint8_t> zeros(reg_entry->nub_info.size, '\0'); 3970 append_hex_value(ostrm, zeros.data(), zeros.size(), false); 3971 } 3972 } 3973 else 3974 { 3975 register_value_in_hex_fixed_width (ostrm, pid, tid, reg_entry, NULL); 3976 } 3977 return SendPacket (ostrm.str()); 3978 } 3979 3980 /* 'Pnn=rrrrr' 3981 Set register number n to value r. 3982 n and r are hex strings. */ 3983 3984 rnb_err_t 3985 RNBRemote::HandlePacket_P (const char *p) 3986 { 3987 if (g_num_reg_entries == 0) 3988 InitializeRegisters (); 3989 3990 if (p == NULL || *p == '\0') 3991 { 3992 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Empty P packet"); 3993 } 3994 if (!m_ctx.HasValidProcessID()) 3995 { 3996 return SendPacket ("E28"); 3997 } 3998 3999 nub_process_t pid = m_ctx.ProcessID(); 4000 4001 StringExtractor packet (p); 4002 4003 const char cmd_char = packet.GetChar(); 4004 // Register ID is always in big endian 4005 const uint32_t reg = packet.GetHexMaxU32 (false, UINT32_MAX); 4006 const char equal_char = packet.GetChar(); 4007 4008 if (cmd_char != 'P') 4009 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Improperly formed P packet"); 4010 4011 if (reg == UINT32_MAX) 4012 return SendPacket ("E29"); 4013 4014 if (equal_char != '=') 4015 return SendPacket ("E30"); 4016 4017 const register_map_entry_t *reg_entry; 4018 4019 if (reg >= g_num_reg_entries) 4020 return SendPacket("E47"); 4021 4022 reg_entry = &g_reg_entries[reg]; 4023 4024 if (reg_entry->nub_info.set == (uint32_t)-1 && reg_entry->nub_info.reg == (uint32_t)-1) 4025 { 4026 DNBLogError("RNBRemote::HandlePacket_P(%s): unknown register number %u requested\n", p, reg); 4027 return SendPacket("E48"); 4028 } 4029 4030 DNBRegisterValue reg_value; 4031 reg_value.info = reg_entry->nub_info; 4032 packet.GetHexBytes (reg_value.value.v_sint8, reg_entry->nub_info.size, 0xcc); 4033 4034 nub_thread_t tid = ExtractThreadIDFromThreadSuffix (p); 4035 if (tid == INVALID_NUB_THREAD) 4036 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "No thread specified in p packet"); 4037 4038 if (!DNBThreadSetRegisterValueByID (pid, tid, reg_entry->nub_info.set, reg_entry->nub_info.reg, ®_value)) 4039 { 4040 return SendPacket ("E32"); 4041 } 4042 return SendPacket ("OK"); 4043 } 4044 4045 /* 'c [addr]' 4046 Continue, optionally from a specified address. */ 4047 4048 rnb_err_t 4049 RNBRemote::HandlePacket_c (const char *p) 4050 { 4051 const nub_process_t pid = m_ctx.ProcessID(); 4052 4053 if (pid == INVALID_NUB_PROCESS) 4054 return SendPacket ("E23"); 4055 4056 DNBThreadResumeAction action = { INVALID_NUB_THREAD, eStateRunning, 0, INVALID_NUB_ADDRESS }; 4057 4058 if (*(p + 1) != '\0') 4059 { 4060 action.tid = GetContinueThread(); 4061 errno = 0; 4062 action.addr = strtoull (p + 1, NULL, 16); 4063 if (errno != 0 && action.addr == 0) 4064 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Could not parse address in c packet"); 4065 } 4066 4067 DNBThreadResumeActions thread_actions; 4068 thread_actions.Append(action); 4069 thread_actions.SetDefaultThreadActionIfNeeded(eStateRunning, 0); 4070 if (!DNBProcessResume (pid, thread_actions.GetFirst(), thread_actions.GetSize())) 4071 return SendPacket ("E25"); 4072 // Don't send an "OK" packet; response is the stopped/exited message. 4073 return rnb_success; 4074 } 4075 4076 rnb_err_t 4077 RNBRemote::HandlePacket_MemoryRegionInfo (const char *p) 4078 { 4079 /* This packet will find memory attributes (e.g. readable, writable, executable, stack, jitted code) 4080 for the memory region containing a given address and return that information. 4081 4082 Users of this packet must be prepared for three results: 4083 4084 Region information is returned 4085 Region information is unavailable for this address because the address is in unmapped memory 4086 Region lookup cannot be performed on this platform or process is not yet launched 4087 This packet isn't implemented 4088 4089 Examples of use: 4090 qMemoryRegionInfo:3a55140 4091 start:3a50000,size:100000,permissions:rwx 4092 4093 qMemoryRegionInfo:0 4094 error:address in unmapped region 4095 4096 qMemoryRegionInfo:3a551140 (on a different platform) 4097 error:region lookup cannot be performed 4098 4099 qMemoryRegionInfo 4100 OK // this packet is implemented by the remote nub 4101 */ 4102 4103 p += sizeof ("qMemoryRegionInfo") - 1; 4104 if (*p == '\0') 4105 return SendPacket ("OK"); 4106 if (*p++ != ':') 4107 return SendPacket ("E67"); 4108 if (*p == '0' && (*(p + 1) == 'x' || *(p + 1) == 'X')) 4109 p += 2; 4110 4111 errno = 0; 4112 uint64_t address = strtoul (p, NULL, 16); 4113 if (errno != 0 && address == 0) 4114 { 4115 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Invalid address in qMemoryRegionInfo packet"); 4116 } 4117 4118 DNBRegionInfo region_info = { 0, 0, 0 }; 4119 DNBProcessMemoryRegionInfo (m_ctx.ProcessID(), address, ®ion_info); 4120 std::ostringstream ostrm; 4121 4122 // start:3a50000,size:100000,permissions:rwx 4123 ostrm << "start:" << std::hex << region_info.addr << ';'; 4124 4125 if (region_info.size > 0) 4126 ostrm << "size:" << std::hex << region_info.size << ';'; 4127 4128 if (region_info.permissions) 4129 { 4130 ostrm << "permissions:"; 4131 4132 if (region_info.permissions & eMemoryPermissionsReadable) 4133 ostrm << 'r'; 4134 if (region_info.permissions & eMemoryPermissionsWritable) 4135 ostrm << 'w'; 4136 if (region_info.permissions & eMemoryPermissionsExecutable) 4137 ostrm << 'x'; 4138 ostrm << ';'; 4139 } 4140 return SendPacket (ostrm.str()); 4141 } 4142 4143 // qGetProfileData;scan_type:0xYYYYYYY 4144 rnb_err_t 4145 RNBRemote::HandlePacket_GetProfileData (const char *p) 4146 { 4147 nub_process_t pid = m_ctx.ProcessID(); 4148 if (pid == INVALID_NUB_PROCESS) 4149 return SendPacket ("OK"); 4150 4151 StringExtractor packet(p += sizeof ("qGetProfileData")); 4152 DNBProfileDataScanType scan_type = eProfileAll; 4153 std::string name; 4154 std::string value; 4155 while (packet.GetNameColonValue(name, value)) 4156 { 4157 if (name.compare ("scan_type") == 0) 4158 { 4159 std::istringstream iss(value); 4160 uint32_t int_value = 0; 4161 if (iss >> std::hex >> int_value) 4162 { 4163 scan_type = (DNBProfileDataScanType)int_value; 4164 } 4165 } 4166 } 4167 4168 std::string data = DNBProcessGetProfileData(pid, scan_type); 4169 if (!data.empty()) 4170 { 4171 return SendPacket (data.c_str()); 4172 } 4173 else 4174 { 4175 return SendPacket ("OK"); 4176 } 4177 } 4178 4179 // QSetEnableAsyncProfiling;enable:[0|1]:interval_usec:XXXXXX;scan_type:0xYYYYYYY 4180 rnb_err_t 4181 RNBRemote::HandlePacket_SetEnableAsyncProfiling (const char *p) 4182 { 4183 nub_process_t pid = m_ctx.ProcessID(); 4184 if (pid == INVALID_NUB_PROCESS) 4185 return SendPacket ("OK"); 4186 4187 StringExtractor packet(p += sizeof ("QSetEnableAsyncProfiling")); 4188 bool enable = false; 4189 uint64_t interval_usec = 0; 4190 DNBProfileDataScanType scan_type = eProfileAll; 4191 std::string name; 4192 std::string value; 4193 while (packet.GetNameColonValue(name, value)) 4194 { 4195 if (name.compare ("enable") == 0) 4196 { 4197 enable = strtoul(value.c_str(), NULL, 10) > 0; 4198 } 4199 else if (name.compare ("interval_usec") == 0) 4200 { 4201 interval_usec = strtoul(value.c_str(), NULL, 10); 4202 } 4203 else if (name.compare ("scan_type") == 0) 4204 { 4205 std::istringstream iss(value); 4206 uint32_t int_value = 0; 4207 if (iss >> std::hex >> int_value) 4208 { 4209 scan_type = (DNBProfileDataScanType)int_value; 4210 } 4211 } 4212 } 4213 4214 if (interval_usec == 0) 4215 { 4216 enable = 0; 4217 } 4218 4219 DNBProcessSetEnableAsyncProfiling(pid, enable, interval_usec, scan_type); 4220 return SendPacket ("OK"); 4221 } 4222 4223 // QEnableCompression:type:<COMPRESSION-TYPE>;minsize:<MINIMUM PACKET SIZE TO COMPRESS>; 4224 // 4225 // type: must be a type previously reported by the qXfer:features: SupportedCompressions list 4226 // 4227 // minsize: is optional; by default the qXfer:features: DefaultCompressionMinSize value is used 4228 // debugserver may have a better idea of what a good minimum packet size to compress is than lldb. 4229 4230 rnb_err_t 4231 RNBRemote::HandlePacket_QEnableCompression (const char *p) 4232 { 4233 p += sizeof ("QEnableCompression:") - 1; 4234 4235 size_t new_compression_minsize = m_compression_minsize; 4236 const char *new_compression_minsize_str = strstr (p, "minsize:"); 4237 if (new_compression_minsize_str) 4238 { 4239 new_compression_minsize_str += strlen ("minsize:"); 4240 errno = 0; 4241 new_compression_minsize = strtoul (new_compression_minsize_str, NULL, 10); 4242 if (errno != 0 || new_compression_minsize == ULONG_MAX) 4243 { 4244 new_compression_minsize = m_compression_minsize; 4245 } 4246 } 4247 4248 #if defined (HAVE_LIBCOMPRESSION) 4249 if (compression_decode_buffer != NULL) 4250 { 4251 if (strstr (p, "type:zlib-deflate;") != nullptr) 4252 { 4253 EnableCompressionNextSendPacket (compression_types::zlib_deflate); 4254 m_compression_minsize = new_compression_minsize; 4255 return SendPacket ("OK"); 4256 } 4257 else if (strstr (p, "type:lz4;") != nullptr) 4258 { 4259 EnableCompressionNextSendPacket (compression_types::lz4); 4260 m_compression_minsize = new_compression_minsize; 4261 return SendPacket ("OK"); 4262 } 4263 else if (strstr (p, "type:lzma;") != nullptr) 4264 { 4265 EnableCompressionNextSendPacket (compression_types::lzma); 4266 m_compression_minsize = new_compression_minsize; 4267 return SendPacket ("OK"); 4268 } 4269 else if (strstr (p, "type:lzfse;") != nullptr) 4270 { 4271 EnableCompressionNextSendPacket (compression_types::lzfse); 4272 m_compression_minsize = new_compression_minsize; 4273 return SendPacket ("OK"); 4274 } 4275 } 4276 #endif 4277 4278 #if defined (HAVE_LIBZ) 4279 if (strstr (p, "type:zlib-deflate;") != nullptr) 4280 { 4281 EnableCompressionNextSendPacket (compression_types::zlib_deflate); 4282 m_compression_minsize = new_compression_minsize; 4283 return SendPacket ("OK"); 4284 } 4285 #endif 4286 4287 return SendPacket ("E88"); 4288 } 4289 4290 rnb_err_t 4291 RNBRemote::HandlePacket_qSpeedTest (const char *p) 4292 { 4293 p += strlen ("qSpeedTest:response_size:"); 4294 char *end = NULL; 4295 errno = 0; 4296 uint64_t response_size = ::strtoul (p, &end, 16); 4297 if (errno != 0) 4298 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Didn't find response_size value at right offset"); 4299 else if (*end == ';') 4300 { 4301 static char g_data[4*1024*1024+16] = "data:"; 4302 memset(g_data + 5, 'a', response_size); 4303 g_data[response_size + 5] = '\0'; 4304 return SendPacket (g_data); 4305 } 4306 else 4307 { 4308 return SendPacket ("E79"); 4309 } 4310 } 4311 4312 rnb_err_t 4313 RNBRemote::HandlePacket_WatchpointSupportInfo (const char *p) 4314 { 4315 /* This packet simply returns the number of supported hardware watchpoints. 4316 4317 Examples of use: 4318 qWatchpointSupportInfo: 4319 num:4 4320 4321 qWatchpointSupportInfo 4322 OK // this packet is implemented by the remote nub 4323 */ 4324 4325 p += sizeof ("qWatchpointSupportInfo") - 1; 4326 if (*p == '\0') 4327 return SendPacket ("OK"); 4328 if (*p++ != ':') 4329 return SendPacket ("E67"); 4330 4331 errno = 0; 4332 uint32_t num = DNBWatchpointGetNumSupportedHWP (m_ctx.ProcessID()); 4333 std::ostringstream ostrm; 4334 4335 // size:4 4336 ostrm << "num:" << std::dec << num << ';'; 4337 return SendPacket (ostrm.str()); 4338 } 4339 4340 /* 'C sig [;addr]' 4341 Resume with signal sig, optionally at address addr. */ 4342 4343 rnb_err_t 4344 RNBRemote::HandlePacket_C (const char *p) 4345 { 4346 const nub_process_t pid = m_ctx.ProcessID(); 4347 4348 if (pid == INVALID_NUB_PROCESS) 4349 return SendPacket ("E36"); 4350 4351 DNBThreadResumeAction action = { INVALID_NUB_THREAD, eStateRunning, 0, INVALID_NUB_ADDRESS }; 4352 int process_signo = -1; 4353 if (*(p + 1) != '\0') 4354 { 4355 action.tid = GetContinueThread(); 4356 char *end = NULL; 4357 errno = 0; 4358 process_signo = static_cast<int>(strtoul (p + 1, &end, 16)); 4359 if (errno != 0) 4360 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Could not parse signal in C packet"); 4361 else if (*end == ';') 4362 { 4363 errno = 0; 4364 action.addr = strtoull (end + 1, NULL, 16); 4365 if (errno != 0 && action.addr == 0) 4366 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Could not parse address in C packet"); 4367 } 4368 } 4369 4370 DNBThreadResumeActions thread_actions; 4371 thread_actions.Append (action); 4372 thread_actions.SetDefaultThreadActionIfNeeded (eStateRunning, action.signal); 4373 if (!DNBProcessSignal(pid, process_signo)) 4374 return SendPacket ("E52"); 4375 if (!DNBProcessResume (pid, thread_actions.GetFirst(), thread_actions.GetSize())) 4376 return SendPacket ("E38"); 4377 /* Don't send an "OK" packet; response is the stopped/exited message. */ 4378 return rnb_success; 4379 } 4380 4381 //---------------------------------------------------------------------- 4382 // 'D' packet 4383 // Detach from gdb. 4384 //---------------------------------------------------------------------- 4385 rnb_err_t 4386 RNBRemote::HandlePacket_D (const char *p) 4387 { 4388 if (m_ctx.HasValidProcessID()) 4389 { 4390 if (DNBProcessDetach(m_ctx.ProcessID())) 4391 SendPacket ("OK"); 4392 else 4393 SendPacket ("E"); 4394 } 4395 else 4396 { 4397 SendPacket ("E"); 4398 } 4399 return rnb_success; 4400 } 4401 4402 /* 'k' 4403 Kill the inferior process. */ 4404 4405 rnb_err_t 4406 RNBRemote::HandlePacket_k (const char *p) 4407 { 4408 DNBLog ("Got a 'k' packet, killing the inferior process."); 4409 // No response to should be sent to the kill packet 4410 if (m_ctx.HasValidProcessID()) 4411 DNBProcessKill (m_ctx.ProcessID()); 4412 SendPacket ("X09"); 4413 return rnb_success; 4414 } 4415 4416 rnb_err_t 4417 RNBRemote::HandlePacket_stop_process (const char *p) 4418 { 4419 //#define TEST_EXIT_ON_INTERRUPT // This should only be uncommented to test exiting on interrupt 4420 #if defined(TEST_EXIT_ON_INTERRUPT) 4421 rnb_err_t err = HandlePacket_k (p); 4422 m_comm.Disconnect(true); 4423 return err; 4424 #else 4425 if (!DNBProcessInterrupt(m_ctx.ProcessID())) 4426 { 4427 // If we failed to interrupt the process, then send a stop 4428 // reply packet as the process was probably already stopped 4429 HandlePacket_last_signal (NULL); 4430 } 4431 return rnb_success; 4432 #endif 4433 } 4434 4435 /* 's' 4436 Step the inferior process. */ 4437 4438 rnb_err_t 4439 RNBRemote::HandlePacket_s (const char *p) 4440 { 4441 const nub_process_t pid = m_ctx.ProcessID(); 4442 if (pid == INVALID_NUB_PROCESS) 4443 return SendPacket ("E32"); 4444 4445 // Hardware supported stepping not supported on arm 4446 nub_thread_t tid = GetContinueThread (); 4447 if (tid == 0 || tid == (nub_thread_t)-1) 4448 tid = GetCurrentThread(); 4449 4450 if (tid == INVALID_NUB_THREAD) 4451 return SendPacket ("E33"); 4452 4453 DNBThreadResumeActions thread_actions; 4454 thread_actions.AppendAction(tid, eStateStepping); 4455 4456 // Make all other threads stop when we are stepping 4457 thread_actions.SetDefaultThreadActionIfNeeded (eStateStopped, 0); 4458 if (!DNBProcessResume (pid, thread_actions.GetFirst(), thread_actions.GetSize())) 4459 return SendPacket ("E49"); 4460 // Don't send an "OK" packet; response is the stopped/exited message. 4461 return rnb_success; 4462 } 4463 4464 /* 'S sig [;addr]' 4465 Step with signal sig, optionally at address addr. */ 4466 4467 rnb_err_t 4468 RNBRemote::HandlePacket_S (const char *p) 4469 { 4470 const nub_process_t pid = m_ctx.ProcessID(); 4471 if (pid == INVALID_NUB_PROCESS) 4472 return SendPacket ("E36"); 4473 4474 DNBThreadResumeAction action = { INVALID_NUB_THREAD, eStateStepping, 0, INVALID_NUB_ADDRESS }; 4475 4476 if (*(p + 1) != '\0') 4477 { 4478 char *end = NULL; 4479 errno = 0; 4480 action.signal = static_cast<int>(strtoul (p + 1, &end, 16)); 4481 if (errno != 0) 4482 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Could not parse signal in S packet"); 4483 else if (*end == ';') 4484 { 4485 errno = 0; 4486 action.addr = strtoull (end + 1, NULL, 16); 4487 if (errno != 0 && action.addr == 0) 4488 { 4489 return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Could not parse address in S packet"); 4490 } 4491 } 4492 } 4493 4494 action.tid = GetContinueThread (); 4495 if (action.tid == 0 || action.tid == (nub_thread_t)-1) 4496 return SendPacket ("E40"); 4497 4498 nub_state_t tstate = DNBThreadGetState (pid, action.tid); 4499 if (tstate == eStateInvalid || tstate == eStateExited) 4500 return SendPacket ("E37"); 4501 4502 4503 DNBThreadResumeActions thread_actions; 4504 thread_actions.Append (action); 4505 4506 // Make all other threads stop when we are stepping 4507 thread_actions.SetDefaultThreadActionIfNeeded(eStateStopped, 0); 4508 if (!DNBProcessResume (pid, thread_actions.GetFirst(), thread_actions.GetSize())) 4509 return SendPacket ("E39"); 4510 4511 // Don't send an "OK" packet; response is the stopped/exited message. 4512 return rnb_success; 4513 } 4514 4515 static const char * 4516 GetArchName (const uint32_t cputype, const uint32_t cpusubtype) 4517 { 4518 switch (cputype) 4519 { 4520 case CPU_TYPE_ARM: 4521 switch (cpusubtype) 4522 { 4523 case 5: return "armv4"; 4524 case 6: return "armv6"; 4525 case 7: return "armv5t"; 4526 case 8: return "xscale"; 4527 case 9: return "armv7"; 4528 case 10: return "armv7f"; 4529 case 11: return "armv7s"; 4530 case 12: return "armv7k"; 4531 case 14: return "armv6m"; 4532 case 15: return "armv7m"; 4533 case 16: return "armv7em"; 4534 default: return "arm"; 4535 } 4536 break; 4537 case CPU_TYPE_ARM64: return "arm64"; 4538 case CPU_TYPE_I386: return "i386"; 4539 case CPU_TYPE_X86_64: 4540 switch (cpusubtype) 4541 { 4542 default: return "x86_64"; 4543 case 8: return "x86_64h"; 4544 } 4545 break; 4546 } 4547 return NULL; 4548 } 4549 4550 static bool 4551 GetHostCPUType (uint32_t &cputype, uint32_t &cpusubtype, uint32_t &is_64_bit_capable, bool &promoted_to_64) 4552 { 4553 static uint32_t g_host_cputype = 0; 4554 static uint32_t g_host_cpusubtype = 0; 4555 static uint32_t g_is_64_bit_capable = 0; 4556 static bool g_promoted_to_64 = false; 4557 4558 if (g_host_cputype == 0) 4559 { 4560 g_promoted_to_64 = false; 4561 size_t len = sizeof(uint32_t); 4562 if (::sysctlbyname("hw.cputype", &g_host_cputype, &len, NULL, 0) == 0) 4563 { 4564 len = sizeof (uint32_t); 4565 if (::sysctlbyname("hw.cpu64bit_capable", &g_is_64_bit_capable, &len, NULL, 0) == 0) 4566 { 4567 if (g_is_64_bit_capable && ((g_host_cputype & CPU_ARCH_ABI64) == 0)) 4568 { 4569 g_promoted_to_64 = true; 4570 g_host_cputype |= CPU_ARCH_ABI64; 4571 } 4572 } 4573 } 4574 4575 len = sizeof(uint32_t); 4576 if (::sysctlbyname("hw.cpusubtype", &g_host_cpusubtype, &len, NULL, 0) == 0) 4577 { 4578 if (g_promoted_to_64 && 4579 g_host_cputype == CPU_TYPE_X86_64 && g_host_cpusubtype == CPU_SUBTYPE_486) 4580 g_host_cpusubtype = CPU_SUBTYPE_X86_64_ALL; 4581 } 4582 } 4583 4584 cputype = g_host_cputype; 4585 cpusubtype = g_host_cpusubtype; 4586 is_64_bit_capable = g_is_64_bit_capable; 4587 promoted_to_64 = g_promoted_to_64; 4588 return g_host_cputype != 0; 4589 } 4590 4591 rnb_err_t 4592 RNBRemote::HandlePacket_qHostInfo (const char *p) 4593 { 4594 std::ostringstream strm; 4595 4596 uint32_t cputype = 0; 4597 uint32_t cpusubtype = 0; 4598 uint32_t is_64_bit_capable = 0; 4599 bool promoted_to_64 = false; 4600 if (GetHostCPUType (cputype, cpusubtype, is_64_bit_capable, promoted_to_64)) 4601 { 4602 strm << "cputype:" << std::dec << cputype << ';'; 4603 strm << "cpusubtype:" << std::dec << cpusubtype << ';'; 4604 } 4605 4606 // The OS in the triple should be "ios" or "macosx" which doesn't match our 4607 // "Darwin" which gets returned from "kern.ostype", so we need to hardcode 4608 // this for now. 4609 if (cputype == CPU_TYPE_ARM || cputype == CPU_TYPE_ARM64) 4610 { 4611 strm << "ostype:ios;"; 4612 // On armv7 we use "synchronous" watchpoints which means the exception is delivered before the instruction executes. 4613 strm << "watchpoint_exceptions_received:before;"; 4614 } 4615 else 4616 { 4617 strm << "ostype:macosx;"; 4618 strm << "watchpoint_exceptions_received:after;"; 4619 } 4620 // char ostype[64]; 4621 // len = sizeof(ostype); 4622 // if (::sysctlbyname("kern.ostype", &ostype, &len, NULL, 0) == 0) 4623 // { 4624 // len = strlen(ostype); 4625 // std::transform (ostype, ostype + len, ostype, tolower); 4626 // strm << "ostype:" << std::dec << ostype << ';'; 4627 // } 4628 4629 strm << "vendor:apple;"; 4630 4631 #if defined (__LITTLE_ENDIAN__) 4632 strm << "endian:little;"; 4633 #elif defined (__BIG_ENDIAN__) 4634 strm << "endian:big;"; 4635 #elif defined (__PDP_ENDIAN__) 4636 strm << "endian:pdp;"; 4637 #endif 4638 4639 if (promoted_to_64) 4640 strm << "ptrsize:8;"; 4641 else 4642 strm << "ptrsize:" << std::dec << sizeof(void *) << ';'; 4643 return SendPacket (strm.str()); 4644 } 4645 4646 void 4647 XMLElementStart (std::ostringstream &s, uint32_t indent, const char *name, bool has_attributes) 4648 { 4649 if (indent) 4650 s << INDENT_WITH_SPACES(indent); 4651 s << '<' << name; 4652 if (!has_attributes) 4653 s << '>' << std::endl; 4654 } 4655 4656 void 4657 XMLElementStartEndAttributes (std::ostringstream &s, bool empty) 4658 { 4659 if (empty) 4660 s << '/'; 4661 s << '>' << std::endl; 4662 } 4663 4664 void 4665 XMLElementEnd (std::ostringstream &s, uint32_t indent, const char *name) 4666 { 4667 if (indent) 4668 s << INDENT_WITH_SPACES(indent); 4669 s << '<' << '/' << name << '>' << std::endl; 4670 } 4671 4672 void 4673 XMLElementWithStringValue (std::ostringstream &s, uint32_t indent, const char *name, const char *value, bool close = true) 4674 { 4675 if (value) 4676 { 4677 if (indent) 4678 s << INDENT_WITH_SPACES(indent); 4679 s << '<' << name << '>' << value; 4680 if (close) 4681 XMLElementEnd(s, 0, name); 4682 } 4683 } 4684 4685 void 4686 XMLElementWithUnsignedValue (std::ostringstream &s, uint32_t indent, const char *name, uint64_t value, bool close = true) 4687 { 4688 if (indent) 4689 s << INDENT_WITH_SPACES(indent); 4690 4691 s << '<' << name << '>' << DECIMAL << value; 4692 if (close) 4693 XMLElementEnd(s, 0, name); 4694 } 4695 4696 void 4697 XMLAttributeString (std::ostringstream &s, const char *name, const char *value, const char *default_value = NULL) 4698 { 4699 if (value) 4700 { 4701 if (default_value && strcmp(value, default_value) == 0) 4702 return; // No need to emit the attribute because it matches the default value 4703 s <<' ' << name << "=\"" << value << "\""; 4704 } 4705 } 4706 4707 void 4708 XMLAttributeUnsignedDecimal (std::ostringstream &s, const char *name, uint64_t value) 4709 { 4710 s <<' ' << name << "=\"" << DECIMAL << value << "\""; 4711 } 4712 4713 void 4714 GenerateTargetXMLRegister (std::ostringstream &s, 4715 const uint32_t reg_num, 4716 nub_size_t num_reg_sets, 4717 const DNBRegisterSetInfo *reg_set_info, 4718 const register_map_entry_t ®) 4719 { 4720 const char *default_lldb_encoding = "uint"; 4721 const char *lldb_encoding = default_lldb_encoding; 4722 const char *gdb_group = "general"; 4723 const char *default_gdb_type = "int"; 4724 const char *gdb_type = default_gdb_type; 4725 const char *default_lldb_format = "hex"; 4726 const char *lldb_format = default_lldb_format; 4727 const char *lldb_set = NULL; 4728 4729 switch (reg.nub_info.type) 4730 { 4731 case Uint: lldb_encoding = "uint"; break; 4732 case Sint: lldb_encoding = "sint"; break; 4733 case IEEE754: lldb_encoding = "ieee754"; if (reg.nub_info.set > 0) gdb_group = "float"; break; 4734 case Vector: lldb_encoding = "vector"; if (reg.nub_info.set > 0) gdb_group = "vector"; break; 4735 } 4736 4737 switch (reg.nub_info.format) 4738 { 4739 case Binary: lldb_format = "binary"; break; 4740 case Decimal: lldb_format = "decimal"; break; 4741 case Hex: lldb_format = "hex"; break; 4742 case Float: gdb_type = "float"; lldb_format = "float"; break; 4743 case VectorOfSInt8: gdb_type = "float"; lldb_format = "vector-sint8"; break; 4744 case VectorOfUInt8: gdb_type = "float"; lldb_format = "vector-uint8"; break; 4745 case VectorOfSInt16: gdb_type = "float"; lldb_format = "vector-sint16"; break; 4746 case VectorOfUInt16: gdb_type = "float"; lldb_format = "vector-uint16"; break; 4747 case VectorOfSInt32: gdb_type = "float"; lldb_format = "vector-sint32"; break; 4748 case VectorOfUInt32: gdb_type = "float"; lldb_format = "vector-uint32"; break; 4749 case VectorOfFloat32: gdb_type = "float"; lldb_format = "vector-float32"; break; 4750 case VectorOfUInt128: gdb_type = "float"; lldb_format = "vector-uint128"; break; 4751 }; 4752 if (reg_set_info && reg.nub_info.set < num_reg_sets) 4753 lldb_set = reg_set_info[reg.nub_info.set].name; 4754 4755 uint32_t indent = 2; 4756 4757 XMLElementStart(s, indent, "reg", true); 4758 XMLAttributeString(s, "name", reg.nub_info.name); 4759 XMLAttributeUnsignedDecimal(s, "regnum", reg_num); 4760 XMLAttributeUnsignedDecimal(s, "offset", reg.offset); 4761 XMLAttributeUnsignedDecimal(s, "bitsize", reg.nub_info.size * 8); 4762 XMLAttributeString(s, "group", gdb_group); 4763 XMLAttributeString(s, "type", gdb_type, default_gdb_type); 4764 XMLAttributeString (s, "altname", reg.nub_info.alt); 4765 XMLAttributeString(s, "encoding", lldb_encoding, default_lldb_encoding); 4766 XMLAttributeString(s, "format", lldb_format, default_lldb_format); 4767 XMLAttributeUnsignedDecimal(s, "group_id", reg.nub_info.set); 4768 if (reg.nub_info.reg_gcc != INVALID_NUB_REGNUM) 4769 XMLAttributeUnsignedDecimal(s, "gcc_regnum", reg.nub_info.reg_gcc); 4770 if (reg.nub_info.reg_dwarf != INVALID_NUB_REGNUM) 4771 XMLAttributeUnsignedDecimal(s, "dwarf_regnum", reg.nub_info.reg_dwarf); 4772 4773 const char *lldb_generic = NULL; 4774 switch (reg.nub_info.reg_generic) 4775 { 4776 case GENERIC_REGNUM_FP: lldb_generic = "fp"; break; 4777 case GENERIC_REGNUM_PC: lldb_generic = "pc"; break; 4778 case GENERIC_REGNUM_SP: lldb_generic = "sp"; break; 4779 case GENERIC_REGNUM_RA: lldb_generic = "ra"; break; 4780 case GENERIC_REGNUM_FLAGS: lldb_generic = "flags"; break; 4781 case GENERIC_REGNUM_ARG1: lldb_generic = "arg1"; break; 4782 case GENERIC_REGNUM_ARG2: lldb_generic = "arg2"; break; 4783 case GENERIC_REGNUM_ARG3: lldb_generic = "arg3"; break; 4784 case GENERIC_REGNUM_ARG4: lldb_generic = "arg4"; break; 4785 case GENERIC_REGNUM_ARG5: lldb_generic = "arg5"; break; 4786 case GENERIC_REGNUM_ARG6: lldb_generic = "arg6"; break; 4787 case GENERIC_REGNUM_ARG7: lldb_generic = "arg7"; break; 4788 case GENERIC_REGNUM_ARG8: lldb_generic = "arg8"; break; 4789 default: break; 4790 } 4791 XMLAttributeString(s, "generic", lldb_generic); 4792 4793 4794 bool empty = reg.value_regnums.empty() && reg.invalidate_regnums.empty(); 4795 if (!empty) 4796 { 4797 if (!reg.value_regnums.empty()) 4798 { 4799 std::ostringstream regnums; 4800 bool first = true; 4801 regnums << DECIMAL; 4802 for (auto regnum : reg.value_regnums) 4803 { 4804 if (!first) 4805 regnums << ','; 4806 regnums << regnum; 4807 first = false; 4808 } 4809 XMLAttributeString(s, "value_regnums", regnums.str().c_str()); 4810 } 4811 4812 if (!reg.invalidate_regnums.empty()) 4813 { 4814 std::ostringstream regnums; 4815 bool first = true; 4816 regnums << DECIMAL; 4817 for (auto regnum : reg.invalidate_regnums) 4818 { 4819 if (!first) 4820 regnums << ','; 4821 regnums << regnum; 4822 first = false; 4823 } 4824 XMLAttributeString(s, "invalidate_regnums", regnums.str().c_str()); 4825 } 4826 } 4827 XMLElementStartEndAttributes(s, true); 4828 } 4829 4830 void 4831 GenerateTargetXMLRegisters (std::ostringstream &s) 4832 { 4833 nub_size_t num_reg_sets = 0; 4834 const DNBRegisterSetInfo *reg_sets = DNBGetRegisterSetInfo (&num_reg_sets); 4835 4836 4837 uint32_t cputype = DNBGetRegisterCPUType(); 4838 if (cputype) 4839 { 4840 XMLElementStart(s, 0, "feature", true); 4841 std::ostringstream name_strm; 4842 name_strm << "com.apple.debugserver." << GetArchName (cputype, 0); 4843 XMLAttributeString(s, "name", name_strm.str().c_str()); 4844 XMLElementStartEndAttributes(s, false); 4845 for (uint32_t reg_num = 0; reg_num < g_num_reg_entries; ++reg_num) 4846 // for (const auto ®: g_dynamic_register_map) 4847 { 4848 GenerateTargetXMLRegister(s, reg_num, num_reg_sets, reg_sets, g_reg_entries[reg_num]); 4849 } 4850 XMLElementEnd(s, 0, "feature"); 4851 4852 if (num_reg_sets > 0) 4853 { 4854 XMLElementStart(s, 0, "groups", false); 4855 for (uint32_t set=1; set<num_reg_sets; ++set) 4856 { 4857 XMLElementStart(s, 2, "group", true); 4858 XMLAttributeUnsignedDecimal(s, "id", set); 4859 XMLAttributeString(s, "name", reg_sets[set].name); 4860 XMLElementStartEndAttributes(s, true); 4861 } 4862 XMLElementEnd(s, 0, "groups"); 4863 } 4864 } 4865 } 4866 4867 static const char *g_target_xml_header = R"(<?xml version="1.0"?> 4868 <target version="1.0">)"; 4869 4870 static const char *g_target_xml_footer = "</target>"; 4871 4872 static std::string g_target_xml; 4873 4874 void 4875 UpdateTargetXML () 4876 { 4877 std::ostringstream s; 4878 s << g_target_xml_header << std::endl; 4879 4880 // Set the architecture 4881 //s << "<architecture>" << arch "</architecture>" << std::endl; 4882 4883 // Set the OSABI 4884 //s << "<osabi>abi-name</osabi>" 4885 4886 GenerateTargetXMLRegisters(s); 4887 4888 s << g_target_xml_footer << std::endl; 4889 4890 // Save the XML output in case it gets retrieved in chunks 4891 g_target_xml = s.str(); 4892 } 4893 4894 rnb_err_t 4895 RNBRemote::HandlePacket_qXfer (const char *command) 4896 { 4897 const char *p = command; 4898 p += strlen ("qXfer:"); 4899 const char *sep = strchr(p, ':'); 4900 if (sep) 4901 { 4902 std::string object(p, sep - p); // "auxv", "backtrace", "features", etc 4903 p = sep + 1; 4904 sep = strchr(p, ':'); 4905 if (sep) 4906 { 4907 std::string rw(p, sep - p); // "read" or "write" 4908 p = sep + 1; 4909 sep = strchr(p, ':'); 4910 if (sep) 4911 { 4912 std::string annex(p, sep - p); // "read" or "write" 4913 4914 p = sep + 1; 4915 sep = strchr(p, ','); 4916 if (sep) 4917 { 4918 std::string offset_str(p, sep - p); // read the length as a string 4919 p = sep + 1; 4920 std::string length_str(p); // read the offset as a string 4921 char *end = nullptr; 4922 const uint64_t offset = strtoul(offset_str.c_str(), &end, 16); // convert offset_str to a offset 4923 if (*end == '\0') 4924 { 4925 const uint64_t length = strtoul(length_str.c_str(), &end, 16); // convert length_str to a length 4926 if (*end == '\0') 4927 { 4928 if (object == "features" && 4929 rw == "read" && 4930 annex == "target.xml") 4931 { 4932 std::ostringstream xml_out; 4933 4934 if (offset == 0) 4935 { 4936 InitializeRegisters (true); 4937 4938 UpdateTargetXML(); 4939 if (g_target_xml.empty()) 4940 return SendPacket("E83"); 4941 4942 if (length > g_target_xml.size()) 4943 { 4944 xml_out << 'l'; // No more data 4945 xml_out << binary_encode_string(g_target_xml); 4946 } 4947 else 4948 { 4949 xml_out << 'm'; // More data needs to be read with a subsequent call 4950 xml_out << binary_encode_string(std::string(g_target_xml, offset, length)); 4951 } 4952 } 4953 else 4954 { 4955 // Retrieving target XML in chunks 4956 if (offset < g_target_xml.size()) 4957 { 4958 std::string chunk(g_target_xml, offset, length); 4959 if (chunk.size() < length) 4960 xml_out << 'l'; // No more data 4961 else 4962 xml_out << 'm'; // More data needs to be read with a subsequent call 4963 xml_out << binary_encode_string(chunk.data()); 4964 } 4965 } 4966 return SendPacket(xml_out.str()); 4967 } 4968 // Well formed, put not supported 4969 return HandlePacket_UNIMPLEMENTED (command); 4970 } 4971 } 4972 } 4973 } 4974 else 4975 { 4976 SendPacket ("E85"); 4977 } 4978 } 4979 else 4980 { 4981 SendPacket ("E86"); 4982 } 4983 } 4984 return SendPacket ("E82"); 4985 } 4986 4987 4988 rnb_err_t 4989 RNBRemote::HandlePacket_qGDBServerVersion (const char *p) 4990 { 4991 std::ostringstream strm; 4992 4993 #if defined(DEBUGSERVER_PROGRAM_NAME) 4994 strm << "name:" DEBUGSERVER_PROGRAM_NAME ";"; 4995 #else 4996 strm << "name:debugserver;"; 4997 #endif 4998 strm << "version:" << DEBUGSERVER_VERSION_NUM << ";"; 4999 5000 return SendPacket (strm.str()); 5001 } 5002 5003 // A helper function that retrieves a single integer value from 5004 // a one-level-deep JSON dictionary of key-value pairs. e.g. 5005 // jThreadExtendedInfo:{"plo_pthread_tsd_base_address_offset":0,"plo_pthread_tsd_base_offset":224,"plo_pthread_tsd_entry_size":8,"thread":144305}] 5006 // 5007 uint64_t 5008 get_integer_value_for_key_name_from_json (const char *key, const char *json_string) 5009 { 5010 uint64_t retval = INVALID_NUB_ADDRESS; 5011 std::string key_with_quotes = "\""; 5012 key_with_quotes += key; 5013 key_with_quotes += "\""; 5014 const char *c = strstr (json_string, key_with_quotes.c_str()); 5015 if (c) 5016 { 5017 c += key_with_quotes.size(); 5018 5019 while (*c != '\0' && (*c == ' ' || *c == '\t' || *c == '\n' || *c == '\r')) 5020 c++; 5021 5022 if (*c == ':') 5023 { 5024 c++; 5025 5026 while (*c != '\0' && (*c == ' ' || *c == '\t' || *c == '\n' || *c == '\r')) 5027 c++; 5028 5029 errno = 0; 5030 retval = strtoul (c, NULL, 10); 5031 if (errno != 0) 5032 { 5033 retval = INVALID_NUB_ADDRESS; 5034 } 5035 } 5036 } 5037 return retval; 5038 5039 } 5040 5041 JSONGenerator::ObjectSP 5042 RNBRemote::GetJSONThreadsInfo(bool threads_with_valid_stop_info_only) 5043 { 5044 JSONGenerator::ArraySP threads_array_sp; 5045 if (m_ctx.HasValidProcessID()) 5046 { 5047 threads_array_sp.reset(new JSONGenerator::Array()); 5048 5049 nub_process_t pid = m_ctx.ProcessID(); 5050 5051 nub_size_t numthreads = DNBProcessGetNumThreads (pid); 5052 for (nub_size_t i = 0; i < numthreads; ++i) 5053 { 5054 nub_thread_t tid = DNBProcessGetThreadAtIndex (pid, i); 5055 5056 struct DNBThreadStopInfo tid_stop_info; 5057 5058 const bool stop_info_valid = DNBThreadGetStopReason (pid, tid, &tid_stop_info); 5059 5060 // If we are doing stop info only, then we only show threads that have a 5061 // valid stop reason 5062 if (threads_with_valid_stop_info_only) 5063 { 5064 if (!stop_info_valid || tid_stop_info.reason == eStopTypeInvalid) 5065 continue; 5066 } 5067 5068 JSONGenerator::DictionarySP thread_dict_sp(new JSONGenerator::Dictionary()); 5069 thread_dict_sp->AddIntegerItem("tid", tid); 5070 5071 std::string reason_value("none"); 5072 5073 if (stop_info_valid) 5074 { 5075 switch (tid_stop_info.reason) 5076 { 5077 case eStopTypeInvalid: 5078 break; 5079 5080 case eStopTypeSignal: 5081 if (tid_stop_info.details.signal.signo != 0) 5082 { 5083 thread_dict_sp->AddIntegerItem("signal", tid_stop_info.details.signal.signo); 5084 reason_value = "signal"; 5085 } 5086 break; 5087 5088 case eStopTypeException: 5089 if (tid_stop_info.details.exception.type != 0) 5090 { 5091 reason_value = "exception"; 5092 thread_dict_sp->AddIntegerItem("metype", tid_stop_info.details.exception.type); 5093 JSONGenerator::ArraySP medata_array_sp(new JSONGenerator::Array()); 5094 for (nub_size_t i=0; i<tid_stop_info.details.exception.data_count; ++i) 5095 { 5096 medata_array_sp->AddItem(JSONGenerator::IntegerSP(new JSONGenerator::Integer(tid_stop_info.details.exception.data[i]))); 5097 } 5098 thread_dict_sp->AddItem("medata", medata_array_sp); 5099 } 5100 break; 5101 5102 case eStopTypeExec: 5103 reason_value = "exec"; 5104 break; 5105 } 5106 } 5107 5108 thread_dict_sp->AddStringItem("reason", reason_value); 5109 5110 if (threads_with_valid_stop_info_only == false) 5111 { 5112 const char *thread_name = DNBThreadGetName (pid, tid); 5113 if (thread_name && thread_name[0]) 5114 thread_dict_sp->AddStringItem("name", thread_name); 5115 5116 thread_identifier_info_data_t thread_ident_info; 5117 if (DNBThreadGetIdentifierInfo (pid, tid, &thread_ident_info)) 5118 { 5119 if (thread_ident_info.dispatch_qaddr != 0) 5120 { 5121 thread_dict_sp->AddIntegerItem("qaddr", thread_ident_info.dispatch_qaddr); 5122 5123 const DispatchQueueOffsets *dispatch_queue_offsets = GetDispatchQueueOffsets(); 5124 if (dispatch_queue_offsets) 5125 { 5126 std::string queue_name; 5127 uint64_t queue_width = 0; 5128 uint64_t queue_serialnum = 0; 5129 dispatch_queue_offsets->GetThreadQueueInfo(pid, thread_ident_info.dispatch_qaddr, queue_name, queue_width, queue_serialnum); 5130 if (!queue_name.empty()) 5131 thread_dict_sp->AddStringItem("qname", queue_name); 5132 if (queue_width == 1) 5133 thread_dict_sp->AddStringItem("qkind", "serial"); 5134 else if (queue_width > 1) 5135 thread_dict_sp->AddStringItem("qkind", "concurrent"); 5136 if (queue_serialnum > 0) 5137 thread_dict_sp->AddIntegerItem("qserial", queue_serialnum); 5138 } 5139 } 5140 } 5141 5142 DNBRegisterValue reg_value; 5143 5144 if (g_reg_entries != NULL) 5145 { 5146 JSONGenerator::DictionarySP registers_dict_sp(new JSONGenerator::Dictionary()); 5147 5148 for (uint32_t reg = 0; reg < g_num_reg_entries; reg++) 5149 { 5150 // Expedite all registers in the first register set that aren't 5151 // contained in other registers 5152 if (g_reg_entries[reg].nub_info.set == 1 && 5153 g_reg_entries[reg].nub_info.value_regs == NULL) 5154 { 5155 if (!DNBThreadGetRegisterValueByID (pid, tid, g_reg_entries[reg].nub_info.set, g_reg_entries[reg].nub_info.reg, ®_value)) 5156 continue; 5157 5158 std::ostringstream reg_num; 5159 reg_num << std::dec << g_reg_entries[reg].gdb_regnum; 5160 // Encode native byte ordered bytes as hex ascii 5161 registers_dict_sp->AddBytesAsHexASCIIString(reg_num.str(), reg_value.value.v_uint8, g_reg_entries[reg].nub_info.size); 5162 } 5163 } 5164 thread_dict_sp->AddItem("registers", registers_dict_sp); 5165 } 5166 5167 // Add expedited stack memory so stack backtracing doesn't need to read anything from the 5168 // frame pointer chain. 5169 StackMemoryMap stack_mmap; 5170 ReadStackMemory (pid, tid, stack_mmap); 5171 if (!stack_mmap.empty()) 5172 { 5173 JSONGenerator::ArraySP memory_array_sp(new JSONGenerator::Array()); 5174 5175 for (const auto &stack_memory : stack_mmap) 5176 { 5177 JSONGenerator::DictionarySP stack_memory_sp(new JSONGenerator::Dictionary()); 5178 stack_memory_sp->AddIntegerItem("address", stack_memory.first); 5179 stack_memory_sp->AddBytesAsHexASCIIString("bytes", stack_memory.second.bytes, stack_memory.second.length); 5180 memory_array_sp->AddItem(stack_memory_sp); 5181 } 5182 thread_dict_sp->AddItem("memory", memory_array_sp); 5183 } 5184 } 5185 5186 threads_array_sp->AddItem(thread_dict_sp); 5187 } 5188 } 5189 return threads_array_sp; 5190 } 5191 5192 rnb_err_t 5193 RNBRemote::HandlePacket_jThreadsInfo (const char *p) 5194 { 5195 JSONGenerator::ObjectSP threads_info_sp; 5196 std::ostringstream json; 5197 std::ostringstream reply_strm; 5198 // If we haven't run the process yet, return an error. 5199 if (m_ctx.HasValidProcessID()) 5200 { 5201 const bool threads_with_valid_stop_info_only = false; 5202 JSONGenerator::ObjectSP threads_info_sp = GetJSONThreadsInfo(threads_with_valid_stop_info_only); 5203 5204 if (threads_info_sp) 5205 { 5206 std::ostringstream strm; 5207 threads_info_sp->Dump (strm); 5208 std::string binary_packet = binary_encode_string (strm.str()); 5209 if (!binary_packet.empty()) 5210 return SendPacket (binary_packet.c_str()); 5211 } 5212 } 5213 return SendPacket ("E85"); 5214 5215 } 5216 5217 rnb_err_t 5218 RNBRemote::HandlePacket_jThreadExtendedInfo (const char *p) 5219 { 5220 nub_process_t pid; 5221 std::ostringstream json; 5222 // If we haven't run the process yet, return an error. 5223 if (!m_ctx.HasValidProcessID()) 5224 { 5225 return SendPacket ("E81"); 5226 } 5227 5228 pid = m_ctx.ProcessID(); 5229 5230 const char thread_extended_info_str[] = { "jThreadExtendedInfo:{" }; 5231 if (strncmp (p, thread_extended_info_str, sizeof (thread_extended_info_str) - 1) == 0) 5232 { 5233 p += strlen (thread_extended_info_str); 5234 5235 uint64_t tid = get_integer_value_for_key_name_from_json ("thread", p); 5236 uint64_t plo_pthread_tsd_base_address_offset = get_integer_value_for_key_name_from_json ("plo_pthread_tsd_base_address_offset", p); 5237 uint64_t plo_pthread_tsd_base_offset = get_integer_value_for_key_name_from_json ("plo_pthread_tsd_base_offset", p); 5238 uint64_t plo_pthread_tsd_entry_size = get_integer_value_for_key_name_from_json ("plo_pthread_tsd_entry_size", p); 5239 uint64_t dti_qos_class_index = get_integer_value_for_key_name_from_json ("dti_qos_class_index", p); 5240 // Commented out the two variables below as they are not being used 5241 // uint64_t dti_queue_index = get_integer_value_for_key_name_from_json ("dti_queue_index", p); 5242 // uint64_t dti_voucher_index = get_integer_value_for_key_name_from_json ("dti_voucher_index", p); 5243 5244 if (tid != INVALID_NUB_ADDRESS) 5245 { 5246 nub_addr_t pthread_t_value = DNBGetPThreadT (pid, tid); 5247 5248 uint64_t tsd_address = INVALID_NUB_ADDRESS; 5249 if (plo_pthread_tsd_entry_size != INVALID_NUB_ADDRESS 5250 && plo_pthread_tsd_base_offset != INVALID_NUB_ADDRESS 5251 && plo_pthread_tsd_entry_size != INVALID_NUB_ADDRESS) 5252 { 5253 tsd_address = DNBGetTSDAddressForThread (pid, tid, plo_pthread_tsd_base_address_offset, plo_pthread_tsd_base_offset, plo_pthread_tsd_entry_size); 5254 } 5255 5256 bool timed_out = false; 5257 Genealogy::ThreadActivitySP thread_activity_sp; 5258 5259 // If the pthread_t value is invalid, or if we were able to fetch the thread's TSD base 5260 // and got an invalid value back, then we have a thread in early startup or shutdown and 5261 // it's possible that gathering the genealogy information for this thread go badly. 5262 // Ideally fetching this info for a thread in these odd states shouldn't matter - but 5263 // we've seen some problems with these new SPI and threads in edge-casey states. 5264 5265 double genealogy_fetch_time = 0; 5266 if (pthread_t_value != INVALID_NUB_ADDRESS && tsd_address != INVALID_NUB_ADDRESS) 5267 { 5268 DNBTimer timer(false); 5269 thread_activity_sp = DNBGetGenealogyInfoForThread (pid, tid, timed_out); 5270 genealogy_fetch_time = timer.ElapsedMicroSeconds(false) / 1000000.0; 5271 } 5272 5273 std::unordered_set<uint32_t> process_info_indexes; // an array of the process info #'s seen 5274 5275 json << "{"; 5276 5277 bool need_to_print_comma = false; 5278 5279 if (thread_activity_sp && timed_out == false) 5280 { 5281 const Genealogy::Activity *activity = &thread_activity_sp->current_activity; 5282 bool need_vouchers_comma_sep = false; 5283 json << "\"activity_query_timed_out\":false,"; 5284 if (genealogy_fetch_time != 0) 5285 { 5286 // If we append the floating point value with << we'll get it in scientific 5287 // notation. 5288 char floating_point_ascii_buffer[64]; 5289 floating_point_ascii_buffer[0] = '\0'; 5290 snprintf (floating_point_ascii_buffer, sizeof (floating_point_ascii_buffer), "%f", genealogy_fetch_time); 5291 if (strlen (floating_point_ascii_buffer) > 0) 5292 { 5293 if (need_to_print_comma) 5294 json << ","; 5295 need_to_print_comma = true; 5296 json << "\"activity_query_duration\":" << floating_point_ascii_buffer; 5297 } 5298 } 5299 if (activity->activity_id != 0) 5300 { 5301 if (need_to_print_comma) 5302 json << ","; 5303 need_to_print_comma = true; 5304 need_vouchers_comma_sep = true; 5305 json << "\"activity\":{"; 5306 json << "\"start\":" << activity->activity_start << ","; 5307 json << "\"id\":" << activity->activity_id << ","; 5308 json << "\"parent_id\":" << activity->parent_id << ","; 5309 json << "\"name\":\"" << json_string_quote_metachars (activity->activity_name) << "\","; 5310 json << "\"reason\":\"" << json_string_quote_metachars (activity->reason) << "\""; 5311 json << "}"; 5312 } 5313 if (thread_activity_sp->messages.size() > 0) 5314 { 5315 need_to_print_comma = true; 5316 if (need_vouchers_comma_sep) 5317 json << ","; 5318 need_vouchers_comma_sep = true; 5319 json << "\"trace_messages\":["; 5320 bool printed_one_message = false; 5321 for (auto iter = thread_activity_sp->messages.begin() ; iter != thread_activity_sp->messages.end(); ++iter) 5322 { 5323 if (printed_one_message) 5324 json << ","; 5325 else 5326 printed_one_message = true; 5327 json << "{"; 5328 json << "\"timestamp\":" << iter->timestamp << ","; 5329 json << "\"activity_id\":" << iter->activity_id << ","; 5330 json << "\"trace_id\":" << iter->trace_id << ","; 5331 json << "\"thread\":" << iter->thread << ","; 5332 json << "\"type\":" << (int) iter->type << ","; 5333 json << "\"process_info_index\":" << iter->process_info_index << ","; 5334 process_info_indexes.insert (iter->process_info_index); 5335 json << "\"message\":\"" << json_string_quote_metachars (iter->message) << "\""; 5336 json << "}"; 5337 } 5338 json << "]"; 5339 } 5340 if (thread_activity_sp->breadcrumbs.size() == 1) 5341 { 5342 need_to_print_comma = true; 5343 if (need_vouchers_comma_sep) 5344 json << ","; 5345 need_vouchers_comma_sep = true; 5346 json << "\"breadcrumb\":{"; 5347 for (auto iter = thread_activity_sp->breadcrumbs.begin() ; iter != thread_activity_sp->breadcrumbs.end(); ++iter) 5348 { 5349 json << "\"breadcrumb_id\":" << iter->breadcrumb_id << ","; 5350 json << "\"activity_id\":" << iter->activity_id << ","; 5351 json << "\"timestamp\":" << iter->timestamp << ","; 5352 json << "\"name\":\"" << json_string_quote_metachars (iter->name) << "\""; 5353 } 5354 json << "}"; 5355 } 5356 if (process_info_indexes.size() > 0) 5357 { 5358 need_to_print_comma = true; 5359 if (need_vouchers_comma_sep) 5360 json << ","; 5361 need_vouchers_comma_sep = true; 5362 json << "\"process_infos\":["; 5363 bool printed_one_process_info = false; 5364 for (auto iter = process_info_indexes.begin(); iter != process_info_indexes.end(); ++iter) 5365 { 5366 if (printed_one_process_info) 5367 json << ","; 5368 else 5369 printed_one_process_info = true; 5370 Genealogy::ProcessExecutableInfoSP image_info_sp; 5371 uint32_t idx = *iter; 5372 image_info_sp = DNBGetGenealogyImageInfo (pid, idx); 5373 json << "{"; 5374 char uuid_buf[37]; 5375 uuid_unparse_upper (image_info_sp->image_uuid, uuid_buf); 5376 json << "\"process_info_index\":" << idx << ","; 5377 json << "\"image_path\":\"" << json_string_quote_metachars (image_info_sp->image_path) << "\","; 5378 json << "\"image_uuid\":\"" << uuid_buf <<"\""; 5379 json << "}"; 5380 } 5381 json << "]"; 5382 } 5383 } 5384 else 5385 { 5386 if (timed_out) 5387 { 5388 if (need_to_print_comma) 5389 json << ","; 5390 need_to_print_comma = true; 5391 json << "\"activity_query_timed_out\":true"; 5392 if (genealogy_fetch_time != 0) 5393 { 5394 // If we append the floating point value with << we'll get it in scientific 5395 // notation. 5396 char floating_point_ascii_buffer[64]; 5397 floating_point_ascii_buffer[0] = '\0'; 5398 snprintf (floating_point_ascii_buffer, sizeof (floating_point_ascii_buffer), "%f", genealogy_fetch_time); 5399 if (strlen (floating_point_ascii_buffer) > 0) 5400 { 5401 json << ","; 5402 json << "\"activity_query_duration\":" << floating_point_ascii_buffer; 5403 } 5404 } 5405 } 5406 } 5407 5408 if (tsd_address != INVALID_NUB_ADDRESS) 5409 { 5410 if (need_to_print_comma) 5411 json << ","; 5412 need_to_print_comma = true; 5413 json << "\"tsd_address\":" << tsd_address; 5414 5415 if (dti_qos_class_index != 0 && dti_qos_class_index != UINT64_MAX) 5416 { 5417 ThreadInfo::QoS requested_qos = DNBGetRequestedQoSForThread (pid, tid, tsd_address, dti_qos_class_index); 5418 if (requested_qos.IsValid()) 5419 { 5420 if (need_to_print_comma) 5421 json << ","; 5422 need_to_print_comma = true; 5423 json << "\"requested_qos\":{"; 5424 json << "\"enum_value\":" << requested_qos.enum_value << ","; 5425 json << "\"constant_name\":\"" << json_string_quote_metachars (requested_qos.constant_name) << "\","; 5426 json << "\"printable_name\":\"" << json_string_quote_metachars (requested_qos.printable_name) << "\""; 5427 json << "}"; 5428 } 5429 } 5430 } 5431 5432 if (pthread_t_value != INVALID_NUB_ADDRESS) 5433 { 5434 if (need_to_print_comma) 5435 json << ","; 5436 need_to_print_comma = true; 5437 json << "\"pthread_t\":" << pthread_t_value; 5438 } 5439 5440 nub_addr_t dispatch_queue_t_value = DNBGetDispatchQueueT (pid, tid); 5441 if (dispatch_queue_t_value != INVALID_NUB_ADDRESS) 5442 { 5443 if (need_to_print_comma) 5444 json << ","; 5445 need_to_print_comma = true; 5446 json << "\"dispatch_queue_t\":" << dispatch_queue_t_value; 5447 } 5448 5449 json << "}"; 5450 std::string json_quoted = binary_encode_string (json.str()); 5451 return SendPacket (json_quoted); 5452 } 5453 } 5454 return SendPacket ("OK"); 5455 } 5456 5457 rnb_err_t 5458 RNBRemote::HandlePacket_jGetLoadedDynamicLibrariesInfos (const char *p) 5459 { 5460 nub_process_t pid; 5461 // If we haven't run the process yet, return an error. 5462 if (!m_ctx.HasValidProcessID()) 5463 { 5464 return SendPacket ("E83"); 5465 } 5466 5467 pid = m_ctx.ProcessID(); 5468 5469 const char get_loaded_dynamic_libraries_infos_str[] = { "jGetLoadedDynamicLibrariesInfos:{" }; 5470 if (strncmp (p, get_loaded_dynamic_libraries_infos_str, sizeof (get_loaded_dynamic_libraries_infos_str) - 1) == 0) 5471 { 5472 p += strlen (get_loaded_dynamic_libraries_infos_str); 5473 5474 nub_addr_t image_list_address = get_integer_value_for_key_name_from_json ("image_list_address", p); 5475 nub_addr_t image_count = get_integer_value_for_key_name_from_json ("image_count", p); 5476 5477 if (image_list_address != INVALID_NUB_ADDRESS && image_count != INVALID_NUB_ADDRESS) 5478 { 5479 JSONGenerator::ObjectSP json_sp; 5480 5481 json_sp = DNBGetLoadedDynamicLibrariesInfos (pid, image_list_address, image_count); 5482 5483 if (json_sp.get()) 5484 { 5485 std::ostringstream json_str; 5486 json_sp->Dump (json_str); 5487 if (json_str.str().size() > 0) 5488 { 5489 std::string json_str_quoted = binary_encode_string (json_str.str()); 5490 return SendPacket (json_str_quoted.c_str()); 5491 } 5492 else 5493 { 5494 SendPacket ("E84"); 5495 } 5496 } 5497 } 5498 } 5499 return SendPacket ("OK"); 5500 } 5501 5502 rnb_err_t 5503 RNBRemote::HandlePacket_qSymbol (const char *command) 5504 { 5505 const char *p = command; 5506 p += strlen ("qSymbol:"); 5507 const char *sep = strchr(p, ':'); 5508 5509 std::string symbol_name; 5510 std::string symbol_value_str; 5511 // Extract the symbol value if there is one 5512 if (sep > p) 5513 symbol_value_str.assign(p, sep - p); 5514 p = sep + 1; 5515 5516 if (*p) 5517 { 5518 // We have a symbol name 5519 symbol_name = std::move(decode_hex_ascii_string(p)); 5520 if (!symbol_value_str.empty()) 5521 { 5522 nub_addr_t symbol_value = decode_uint64(symbol_value_str.c_str(), 16); 5523 if (symbol_name == "dispatch_queue_offsets") 5524 m_dispatch_queue_offsets_addr = symbol_value; 5525 } 5526 ++m_qSymbol_index; 5527 } 5528 else 5529 { 5530 // No symbol name, set our symbol index to zero so we can 5531 // read any symbols that we need 5532 m_qSymbol_index = 0; 5533 } 5534 5535 symbol_name.clear(); 5536 5537 if (m_qSymbol_index == 0) 5538 { 5539 if (m_dispatch_queue_offsets_addr == INVALID_NUB_ADDRESS) 5540 symbol_name = "dispatch_queue_offsets"; 5541 else 5542 ++m_qSymbol_index; 5543 } 5544 5545 // // Lookup next symbol when we have one... 5546 // if (m_qSymbol_index == 1) 5547 // { 5548 // } 5549 5550 5551 if (symbol_name.empty()) 5552 { 5553 // Done with symbol lookups 5554 return SendPacket ("OK"); 5555 } 5556 else 5557 { 5558 std::ostringstream reply; 5559 reply << "qSymbol:"; 5560 for (size_t i = 0; i < symbol_name.size(); ++i) 5561 reply << RAWHEX8(symbol_name[i]); 5562 return SendPacket (reply.str().c_str()); 5563 } 5564 } 5565 5566 // Note that all numeric values returned by qProcessInfo are hex encoded, 5567 // including the pid and the cpu type. 5568 5569 rnb_err_t 5570 RNBRemote::HandlePacket_qProcessInfo (const char *p) 5571 { 5572 nub_process_t pid; 5573 std::ostringstream rep; 5574 5575 // If we haven't run the process yet, return an error. 5576 if (!m_ctx.HasValidProcessID()) 5577 return SendPacket ("E68"); 5578 5579 pid = m_ctx.ProcessID(); 5580 5581 rep << "pid:" << std::hex << pid << ";"; 5582 5583 int procpid_mib[4]; 5584 procpid_mib[0] = CTL_KERN; 5585 procpid_mib[1] = KERN_PROC; 5586 procpid_mib[2] = KERN_PROC_PID; 5587 procpid_mib[3] = pid; 5588 struct kinfo_proc proc_kinfo; 5589 size_t proc_kinfo_size = sizeof(struct kinfo_proc); 5590 5591 if (::sysctl (procpid_mib, 4, &proc_kinfo, &proc_kinfo_size, NULL, 0) == 0) 5592 { 5593 if (proc_kinfo_size > 0) 5594 { 5595 rep << "parent-pid:" << std::hex << proc_kinfo.kp_eproc.e_ppid << ";"; 5596 rep << "real-uid:" << std::hex << proc_kinfo.kp_eproc.e_pcred.p_ruid << ";"; 5597 rep << "real-gid:" << std::hex << proc_kinfo.kp_eproc.e_pcred.p_rgid << ";"; 5598 rep << "effective-uid:" << std::hex << proc_kinfo.kp_eproc.e_ucred.cr_uid << ";"; 5599 if (proc_kinfo.kp_eproc.e_ucred.cr_ngroups > 0) 5600 rep << "effective-gid:" << std::hex << proc_kinfo.kp_eproc.e_ucred.cr_groups[0] << ";"; 5601 } 5602 } 5603 5604 cpu_type_t cputype = DNBProcessGetCPUType (pid); 5605 if (cputype == 0) 5606 { 5607 DNBLog ("Unable to get the process cpu_type, making a best guess."); 5608 cputype = best_guess_cpu_type(); 5609 } 5610 5611 if (cputype != 0) 5612 { 5613 rep << "cputype:" << std::hex << cputype << ";"; 5614 } 5615 5616 bool host_cpu_is_64bit = false; 5617 uint32_t is64bit_capable; 5618 size_t is64bit_capable_len = sizeof (is64bit_capable); 5619 if (sysctlbyname("hw.cpu64bit_capable", &is64bit_capable, &is64bit_capable_len, NULL, 0) == 0) 5620 host_cpu_is_64bit = is64bit_capable != 0; 5621 5622 uint32_t cpusubtype; 5623 size_t cpusubtype_len = sizeof(cpusubtype); 5624 if (::sysctlbyname("hw.cpusubtype", &cpusubtype, &cpusubtype_len, NULL, 0) == 0) 5625 { 5626 // If a process is CPU_TYPE_X86, then ignore the cpusubtype that we detected 5627 // from the host and use CPU_SUBTYPE_I386_ALL because we don't want the 5628 // CPU_SUBTYPE_X86_ARCH1 or CPU_SUBTYPE_X86_64_H to be used as the cpu subtype 5629 // for i386... 5630 if (host_cpu_is_64bit) 5631 { 5632 if (cputype == CPU_TYPE_X86) 5633 { 5634 cpusubtype = 3; // CPU_SUBTYPE_I386_ALL 5635 } 5636 else if (cputype == CPU_TYPE_ARM) 5637 { 5638 // We can query a process' cputype but we cannot query a process' cpusubtype. 5639 // If the process has cputype CPU_TYPE_ARM, then it is an armv7 (32-bit process) and we 5640 // need to override the host cpusubtype (which is in the CPU_SUBTYPE_ARM64 subtype namespace) 5641 // with a reasonable CPU_SUBTYPE_ARMV7 subtype. 5642 cpusubtype = 11; // CPU_SUBTYPE_ARM_V7S 5643 } 5644 } 5645 rep << "cpusubtype:" << std::hex << cpusubtype << ';'; 5646 } 5647 5648 // The OS in the triple should be "ios" or "macosx" which doesn't match our 5649 // "Darwin" which gets returned from "kern.ostype", so we need to hardcode 5650 // this for now. 5651 if (cputype == CPU_TYPE_ARM || cputype == CPU_TYPE_ARM64) 5652 rep << "ostype:ios;"; 5653 else 5654 { 5655 bool is_ios_simulator = false; 5656 if (cputype == CPU_TYPE_X86 || cputype == CPU_TYPE_X86_64) 5657 { 5658 // Check for iOS simulator binaries by getting the process argument 5659 // and environment and checking for SIMULATOR_UDID in the environment 5660 int proc_args_mib[3] = { CTL_KERN, KERN_PROCARGS2, (int)pid }; 5661 5662 uint8_t arg_data[8192]; 5663 size_t arg_data_size = sizeof(arg_data); 5664 if (::sysctl (proc_args_mib, 3, arg_data, &arg_data_size , NULL, 0) == 0) 5665 { 5666 DNBDataRef data (arg_data, arg_data_size, false); 5667 DNBDataRef::offset_t offset = 0; 5668 uint32_t argc = data.Get32 (&offset); 5669 const char *cstr; 5670 5671 cstr = data.GetCStr (&offset); 5672 if (cstr) 5673 { 5674 // Skip NULLs 5675 while (1) 5676 { 5677 const char *p = data.PeekCStr(offset); 5678 if ((p == NULL) || (*p != '\0')) 5679 break; 5680 ++offset; 5681 } 5682 // Now skip all arguments 5683 for (uint32_t i = 0; i < argc; ++i) 5684 { 5685 data.GetCStr(&offset); 5686 } 5687 5688 // Now iterate across all environment variables 5689 while ((cstr = data.GetCStr(&offset))) 5690 { 5691 if (strncmp(cstr, "SIMULATOR_UDID=", strlen("SIMULATOR_UDID=")) == 0) 5692 { 5693 is_ios_simulator = true; 5694 break; 5695 } 5696 if (cstr[0] == '\0') 5697 break; 5698 5699 } 5700 } 5701 } 5702 } 5703 if (is_ios_simulator) 5704 rep << "ostype:ios;"; 5705 else 5706 rep << "ostype:macosx;"; 5707 } 5708 5709 rep << "vendor:apple;"; 5710 5711 #if defined (__LITTLE_ENDIAN__) 5712 rep << "endian:little;"; 5713 #elif defined (__BIG_ENDIAN__) 5714 rep << "endian:big;"; 5715 #elif defined (__PDP_ENDIAN__) 5716 rep << "endian:pdp;"; 5717 #endif 5718 5719 #if (defined (__x86_64__) || defined (__i386__)) && defined (x86_THREAD_STATE) 5720 nub_thread_t thread = DNBProcessGetCurrentThreadMachPort (pid); 5721 kern_return_t kr; 5722 x86_thread_state_t gp_regs; 5723 mach_msg_type_number_t gp_count = x86_THREAD_STATE_COUNT; 5724 kr = thread_get_state (static_cast<thread_act_t>(thread), 5725 x86_THREAD_STATE, 5726 (thread_state_t) &gp_regs, 5727 &gp_count); 5728 if (kr == KERN_SUCCESS) 5729 { 5730 if (gp_regs.tsh.flavor == x86_THREAD_STATE64) 5731 rep << "ptrsize:8;"; 5732 else 5733 rep << "ptrsize:4;"; 5734 } 5735 #elif defined (__arm__) 5736 rep << "ptrsize:4;"; 5737 #elif (defined (__arm64__) || defined (__aarch64__)) && defined (ARM_UNIFIED_THREAD_STATE) 5738 nub_thread_t thread = DNBProcessGetCurrentThreadMachPort (pid); 5739 kern_return_t kr; 5740 arm_unified_thread_state_t gp_regs; 5741 mach_msg_type_number_t gp_count = ARM_UNIFIED_THREAD_STATE_COUNT; 5742 kr = thread_get_state (thread, ARM_UNIFIED_THREAD_STATE, 5743 (thread_state_t) &gp_regs, &gp_count); 5744 if (kr == KERN_SUCCESS) 5745 { 5746 if (gp_regs.ash.flavor == ARM_THREAD_STATE64) 5747 rep << "ptrsize:8;"; 5748 else 5749 rep << "ptrsize:4;"; 5750 } 5751 #endif 5752 5753 return SendPacket (rep.str()); 5754 } 5755 5756 const RNBRemote::DispatchQueueOffsets * 5757 RNBRemote::GetDispatchQueueOffsets() 5758 { 5759 if (!m_dispatch_queue_offsets.IsValid() && m_dispatch_queue_offsets_addr != INVALID_NUB_ADDRESS && m_ctx.HasValidProcessID()) 5760 { 5761 nub_process_t pid = m_ctx.ProcessID(); 5762 nub_size_t bytes_read = DNBProcessMemoryRead(pid, m_dispatch_queue_offsets_addr, sizeof(m_dispatch_queue_offsets), &m_dispatch_queue_offsets); 5763 if (bytes_read != sizeof(m_dispatch_queue_offsets)) 5764 m_dispatch_queue_offsets.Clear(); 5765 } 5766 5767 if (m_dispatch_queue_offsets.IsValid()) 5768 return &m_dispatch_queue_offsets; 5769 else 5770 return nullptr; 5771 } 5772 5773 void 5774 RNBRemote::EnableCompressionNextSendPacket (compression_types type) 5775 { 5776 m_compression_mode = type; 5777 m_enable_compression_next_send_packet = true; 5778 } 5779 5780 compression_types 5781 RNBRemote::GetCompressionType () 5782 { 5783 // The first packet we send back to the debugger after a QEnableCompression request 5784 // should be uncompressed -- so we can indicate whether the compression was enabled 5785 // or not via OK / Enn returns. After that, all packets sent will be using the 5786 // compression protocol. 5787 5788 if (m_enable_compression_next_send_packet) 5789 { 5790 // One time, we send back "None" as our compression type 5791 m_enable_compression_next_send_packet = false; 5792 return compression_types::none; 5793 } 5794 return m_compression_mode; 5795 } 5796