diff options
Diffstat (limited to 'lldb')
-rw-r--r-- | lldb/include/lldb/Core/Communication.h | 3 | ||||
-rw-r--r-- | lldb/source/Core/Communication.cpp | 2 | ||||
-rw-r--r-- | lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp | 144 | ||||
-rw-r--r-- | lldb/tools/debugserver/source/RNBRemote.cpp | 119 | ||||
-rw-r--r-- | lldb/tools/debugserver/source/RNBRemote.h | 2 |
5 files changed, 158 insertions, 112 deletions
diff --git a/lldb/include/lldb/Core/Communication.h b/lldb/include/lldb/Core/Communication.h index 8577f3340cc..2266bb9082b 100644 --- a/lldb/include/lldb/Core/Communication.h +++ b/lldb/include/lldb/Core/Communication.h @@ -358,7 +358,8 @@ protected: lldb::thread_t m_read_thread; ///< The read thread handle in case we need to cancel the thread. bool m_read_thread_enabled; std::string m_bytes; ///< A buffer to cache bytes read in the ReadThread function. - Mutex m_bytes_mutex; ///< A mutex to protect multi-threaded access to the cached bytes. + Mutex m_bytes_mutex; ///< A mutex to protect multi-threaded access to the cached bytes. + Mutex m_write_mutex; ///< Don't let multiple threads write at the same time... ReadThreadBytesReceived m_callback; void *m_callback_baton; bool m_close_on_eof; diff --git a/lldb/source/Core/Communication.cpp b/lldb/source/Core/Communication.cpp index b17865738f5..72560ef6f73 100644 --- a/lldb/source/Core/Communication.cpp +++ b/lldb/source/Core/Communication.cpp @@ -32,6 +32,7 @@ Communication::Communication(const char *name) : m_read_thread_enabled (false), m_bytes(), m_bytes_mutex (Mutex::eMutexTypeRecursive), + m_write_mutex (Mutex::eMutexTypeNormal), m_callback (NULL), m_callback_baton (NULL), m_close_on_eof (true) @@ -205,6 +206,7 @@ Communication::Write (const void *src, size_t src_len, ConnectionStatus &status, { lldb::ConnectionSP connection_sp (m_connection_sp); + Mutex::Locker (m_write_mutex); lldb_private::LogIfAnyCategoriesSet (LIBLLDB_LOG_COMMUNICATION, "%p Communication::Write (src = %p, src_len = %zu) connection = %p", this, diff --git a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp index aa100840936..20af4b44a1c 100644 --- a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp @@ -134,6 +134,7 @@ GDBRemoteCommunication::SendPacketAndWaitForResponse TimeValue timeout_time; timeout_time = TimeValue::Now(); timeout_time.OffsetWithSeconds (timeout_seconds); + LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS)); if (GetSequenceMutex (locker)) { @@ -149,24 +150,53 @@ GDBRemoteCommunication::SendPacketAndWaitForResponse m_async_timeout = timeout_seconds; m_async_packet_predicate.SetValue (true, eBroadcastNever); + if (log) + log->Printf ("async: async packet = %s", m_async_packet.c_str()); + bool timed_out = false; bool sent_interrupt = false; if (SendInterrupt(locker, 2, sent_interrupt, timed_out)) { - if (m_async_packet_predicate.WaitForValueEqualTo (false, &timeout_time, &timed_out)) + if (sent_interrupt) { - response = m_async_response; - return response.GetStringRef().size(); + if (log) + log->Printf ("async: sent interrupt"); + if (m_async_packet_predicate.WaitForValueEqualTo (false, &timeout_time, &timed_out)) + { + if (log) + log->Printf ("async: got response"); + response = m_async_response; + return response.GetStringRef().size(); + } + else + { + if (log) + log->Printf ("async: timed out waiting for response"); + } + + // Make sure we wait until the continue packet has been sent again... + if (m_private_is_running.WaitForValueEqualTo (true, &timeout_time, &timed_out)) + { + if (log) + log->Printf ("async: timed out waiting for process to resume"); + } + } + else + { + // We had a racy condition where we went to send the interrupt + // yet we were able to get the loc } } -// if (timed_out) -// m_error.SetErrorString("Timeout."); -// else -// m_error.SetErrorString("Unknown error."); + else + { + if (log) + log->Printf ("async: failed to interrupt"); + } } else { -// m_error.SetErrorString("Sequence mutex is locked."); + if (log) + log->Printf ("mutex taken and send_async == false, aborting packet"); } } return 0; @@ -212,17 +242,23 @@ GDBRemoteCommunication::SendContinuePacketAndWaitForResponse Mutex::Locker locker(m_sequence_mutex); StateType state = eStateRunning; - if (SendPacket(payload, packet_length) == 0) - state = eStateInvalid; - BroadcastEvent(eBroadcastBitRunPacketSent, NULL); m_public_is_running.SetValue (true, eBroadcastNever); - m_private_is_running.SetValue (true, eBroadcastNever); - + // Set the starting continue packet into "continue_packet". This packet + // make change if we are interrupted and we continue after an async packet... + std::string continue_packet(payload, packet_length); + while (state == eStateRunning) { if (log) - log->Printf ("GDBRemoteCommunication::%s () WaitForPacket(...)", __FUNCTION__); + log->Printf ("GDBRemoteCommunication::%s () sending continue packet: %s", __FUNCTION__, continue_packet.c_str()); + if (SendPacket(continue_packet.c_str(), continue_packet.size()) == 0) + state = eStateInvalid; + + m_private_is_running.SetValue (true, eBroadcastNever); + + if (log) + log->Printf ("GDBRemoteCommunication::%s () WaitForPacket(%.*s)", __FUNCTION__); if (WaitForPacket (response, (TimeValue*)NULL)) { @@ -280,32 +316,28 @@ GDBRemoteCommunication::SendContinuePacketAndWaitForResponse Host::GetSignalAsCString (signo), Host::GetSignalAsCString (async_signal)); - if (SendPacket(signal_packet, signal_packet_len) == 0) - { - if (log) - log->Printf ("async: error: failed to resume with %s", - Host::GetSignalAsCString (async_signal)); - state = eStateExited; - break; - } - else - { - m_private_is_running.SetValue (true, eBroadcastNever); - continue; - } + // Set the continue packet to resume... + continue_packet.assign(signal_packet, signal_packet_len); + continue; } } else if (m_async_packet_predicate.GetValue()) { - if (log) - log->Printf ("async: send async packet: %s", - m_async_packet.c_str()); - // We are supposed to send an asynchronous packet while // we are running. m_async_response.Clear(); - if (!m_async_packet.empty()) + if (m_async_packet.empty()) { + if (log) + log->Printf ("async: error: empty async packet"); + + } + else + { + if (log) + log->Printf ("async: sending packet: %s", + m_async_packet.c_str()); + SendPacketAndWaitForResponse (&m_async_packet[0], m_async_packet.size(), m_async_response, @@ -313,25 +345,13 @@ GDBRemoteCommunication::SendContinuePacketAndWaitForResponse false); } // Let the other thread that was trying to send the async - // packet know that the packet has been sent. + // packet know that the packet has been sent and response is + // ready... m_async_packet_predicate.SetValue(false, eBroadcastAlways); - if (log) - log->Printf ("async: resume after async response received: %s", - m_async_response.GetStringRef().c_str()); - - // Continue again - if (SendPacket("c", 1) == 0) - { - // Failed to send the continue packet - state = eStateExited; - break; - } - else - { - m_private_is_running.SetValue (true, eBroadcastNever); - continue; - } + // Set the continue packet to resume... + continue_packet.assign (1, 'c'); + continue; } // Stop with signal and thread info state = eStateStopped; @@ -477,8 +497,9 @@ GDBRemoteCommunication::SendInterrupt { sent_interrupt = false; timed_out = false; + LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS)); - if (IsConnected() && IsRunning()) + if (IsRunning()) { // Only send an interrupt if our debugserver is running... if (GetSequenceMutex (locker) == false) @@ -493,14 +514,35 @@ GDBRemoteCommunication::SendInterrupt timeout = TimeValue::Now(); timeout.OffsetWithSeconds (seconds_to_wait_for_stop); } + size_t bytes_written = Write (&ctrl_c, 1, status, NULL); ProcessGDBRemoteLog::LogIf (GDBR_LOG_PACKETS | GDBR_LOG_PROCESS, "send packet: \\x03"); - if (Write (&ctrl_c, 1, status, NULL) > 0) + if (bytes_written > 0) { sent_interrupt = true; if (seconds_to_wait_for_stop) + { m_private_is_running.WaitForValueEqualTo (false, &timeout, &timed_out); + if (log) + log->Printf ("GDBRemoteCommunication::%s () - sent interrupt, private state stopped", __FUNCTION__); + + } + else + { + if (log) + log->Printf ("GDBRemoteCommunication::%s () - sent interrupt, not waiting for stop...", __FUNCTION__); + } return true; } + else + { + if (log) + log->Printf ("GDBRemoteCommunication::%s () - failed to write interrupt", __FUNCTION__); + } + } + else + { + if (log) + log->Printf ("GDBRemoteCommunication::%s () - got sequence mutex without having to interrupt", __FUNCTION__); } } return false; diff --git a/lldb/tools/debugserver/source/RNBRemote.cpp b/lldb/tools/debugserver/source/RNBRemote.cpp index 8a94570da61..49aa5428095 100644 --- a/lldb/tools/debugserver/source/RNBRemote.cpp +++ b/lldb/tools/debugserver/source/RNBRemote.cpp @@ -383,7 +383,7 @@ RNBRemote::GetPacketPayload (std::string &return_packet) } } } - break; + break; default: DNBLogThreadedIf (LOG_RNB_REMOTE, "%8u RNBRemote::%s tossing unexpected packet???? %s", (uint32_t)m_comm.Timer().ElapsedMicroSeconds(true), __FUNCTION__, return_packet.c_str()); @@ -403,9 +403,9 @@ RNBRemote::HandlePacket_UNIMPLEMENTED (const char* p) } rnb_err_t -RNBRemote::HandlePacket_ILLFORMED (const char *description) +RNBRemote::HandlePacket_ILLFORMED (const char *file, int line, const char *p, const char *description) { - DNBLogThreadedIf (LOG_RNB_MAX, "%8u RNBRemote::%s sending ILLFORMED", (uint32_t)m_comm.Timer().ElapsedMicroSeconds(true), __FUNCTION__); + DNBLogThreadedIf (LOG_RNB_PACKETS, "%8u %s:%i ILLFORMED: '%s' (%s)", (uint32_t)m_comm.Timer().ElapsedMicroSeconds(true), file, line, __FUNCTION__, p); return SendPacket ("E03"); } @@ -583,8 +583,9 @@ RNBRemote::CommDataReceived(const std::string& new_data) } else { - // Add two for the checksum bytes - end_idx += 4; + // Add two for the checksum bytes and 1 to point to the + // byte just past the end of this packet + end_idx += 2 + 1; } break; @@ -1125,12 +1126,12 @@ RNBRemote::HandlePacket_A (const char *p) { if (p == NULL || *p == '\0') { - return HandlePacket_ILLFORMED ("Null packet for 'A' pkt"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Null packet for 'A' pkt"); } p++; if (p == '\0' || !isdigit (*p)) { - return HandlePacket_ILLFORMED ("arglen not specified on 'A' pkt"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "arglen not specified on 'A' pkt"); } /* I promise I don't modify it anywhere in this function. strtoul()'s @@ -1150,11 +1151,11 @@ RNBRemote::HandlePacket_A (const char *p) arglen = strtoul (buf, &c, 10); if (errno != 0 && arglen == 0) { - return HandlePacket_ILLFORMED ("arglen not a number on 'A' pkt"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "arglen not a number on 'A' pkt"); } if (*c != ',') { - return HandlePacket_ILLFORMED ("arglen not followed by comma on 'A' pkt"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "arglen not followed by comma on 'A' pkt"); } buf = c + 1; @@ -1162,11 +1163,11 @@ RNBRemote::HandlePacket_A (const char *p) argnum = strtoul (buf, &c, 10); if (errno != 0 && argnum == 0) { - return HandlePacket_ILLFORMED ("argnum not a number on 'A' pkt"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "argnum not a number on 'A' pkt"); } if (*c != ',') { - return HandlePacket_ILLFORMED ("arglen not followed by comma on 'A' pkt"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "arglen not followed by comma on 'A' pkt"); } buf = c + 1; @@ -1183,7 +1184,7 @@ RNBRemote::HandlePacket_A (const char *p) int ch = strtoul (smallbuf, NULL, 16); if (errno != 0 && ch == 0) { - return HandlePacket_ILLFORMED ("non-hex char in arg on 'A' pkt"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "non-hex char in arg on 'A' pkt"); } arg.push_back(ch); @@ -1209,7 +1210,7 @@ RNBRemote::HandlePacket_H (const char *p) p++; // skip 'H' if (*p != 'c' && *p != 'g') { - return HandlePacket_ILLFORMED ("Missing 'c' or 'g' type in H packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Missing 'c' or 'g' type in H packet"); } if (!m_ctx.HasValidProcessID()) @@ -1223,7 +1224,7 @@ RNBRemote::HandlePacket_H (const char *p) nub_thread_t tid = strtoul (p + 1, NULL, 16); if (errno != 0 && tid == 0) { - return HandlePacket_ILLFORMED ("Invalid thread number in H packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Invalid thread number in H packet"); } if (*p == 'c') SetContinueThread (tid); @@ -1333,12 +1334,12 @@ RNBRemote::HandlePacket_qThreadExtraInfo (const char *p) sequence of letters encoded in as 2-hex-chars-per-letter. */ p += strlen ("qThreadExtraInfo"); if (*p++ != ',') - return HandlePacket_ILLFORMED ("Ill formed qThreadExtraInfo packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Illformed qThreadExtraInfo packet"); errno = 0; nub_thread_t tid = strtoul (p, NULL, 16); if (errno != 0 && tid == 0) { - return HandlePacket_ILLFORMED ("Invalid thread number in qThreadExtraInfo packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Invalid thread number in qThreadExtraInfo packet"); } const char * threadInfo = DNBThreadGetInfo(pid, tid); @@ -1760,7 +1761,7 @@ RNBRemote::HandlePacket_QSetMaxPayloadSize (const char *p) uint32_t size = strtoul (p, NULL, 16); if (errno != 0 && size == 0) { - return HandlePacket_ILLFORMED ("Invalid length in QSetMaxPayloadSize packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Invalid length in QSetMaxPayloadSize packet"); } m_max_payload_size = size; return SendPacket ("OK"); @@ -1777,7 +1778,7 @@ RNBRemote::HandlePacket_QSetMaxPacketSize (const char *p) uint32_t size = strtoul (p, NULL, 16); if (errno != 0 && size == 0) { - return HandlePacket_ILLFORMED ("Invalid length in QSetMaxPacketSize packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Invalid length in QSetMaxPacketSize packet"); } m_max_payload_size = size - 5; return SendPacket ("OK"); @@ -2050,7 +2051,7 @@ RNBRemote::HandlePacket_M (const char *p) { if (p == NULL || p[0] == '\0' || strlen (p) < 3) { - return HandlePacket_ILLFORMED ("Too short M packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Too short M packet"); } char *c; @@ -2059,11 +2060,11 @@ RNBRemote::HandlePacket_M (const char *p) nub_addr_t addr = strtoull (p, &c, 16); if (errno != 0 && addr == 0) { - return HandlePacket_ILLFORMED ("Invalid address in M packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Invalid address in M packet"); } if (*c != ',') { - return HandlePacket_ILLFORMED ("Comma sep missing in M packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Comma sep missing in M packet"); } /* Advance 'p' to the length part of the packet. */ @@ -2073,7 +2074,7 @@ RNBRemote::HandlePacket_M (const char *p) uint32_t length = strtoul (p, &c, 16); if (errno != 0 && length == 0) { - return HandlePacket_ILLFORMED ("Invalid length in M packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Invalid length in M packet"); } if (length == 0) { @@ -2082,7 +2083,7 @@ RNBRemote::HandlePacket_M (const char *p) if (*c != ':') { - return HandlePacket_ILLFORMED ("Missing colon in M packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Missing colon in M packet"); } /* Advance 'p' to the data part of the packet. */ p += (c - p) + 1; @@ -2090,7 +2091,7 @@ RNBRemote::HandlePacket_M (const char *p) int datalen = strlen (p); if (datalen & 0x1) { - return HandlePacket_ILLFORMED ("Uneven # of hex chars for data in M packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Uneven # of hex chars for data in M packet"); } if (datalen == 0) { @@ -2110,7 +2111,7 @@ RNBRemote::HandlePacket_M (const char *p) uint8_t byte = strtoul (hexbuf, NULL, 16); if (errno != 0 && byte == 0) { - return HandlePacket_ILLFORMED ("Invalid hex byte in M packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Invalid hex byte in M packet"); } *i++ = byte; p += 2; @@ -2129,7 +2130,7 @@ RNBRemote::HandlePacket_m (const char *p) { if (p == NULL || p[0] == '\0' || strlen (p) < 3) { - return HandlePacket_ILLFORMED ("Too short m packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Too short m packet"); } char *c; @@ -2138,11 +2139,11 @@ RNBRemote::HandlePacket_m (const char *p) nub_addr_t addr = strtoull (p, &c, 16); if (errno != 0 && addr == 0) { - return HandlePacket_ILLFORMED ("Invalid address in m packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Invalid address in m packet"); } if (*c != ',') { - return HandlePacket_ILLFORMED ("Comma sep missing in m packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Comma sep missing in m packet"); } /* Advance 'p' to the length part of the packet. */ @@ -2152,7 +2153,7 @@ RNBRemote::HandlePacket_m (const char *p) uint32_t length = strtoul (p, NULL, 16); if (errno != 0 && length == 0) { - return HandlePacket_ILLFORMED ("Invalid length in m packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Invalid length in m packet"); } if (length == 0) { @@ -2181,7 +2182,7 @@ RNBRemote::HandlePacket_X (const char *p) { if (p == NULL || p[0] == '\0' || strlen (p) < 3) { - return HandlePacket_ILLFORMED ("Too short X packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Too short X packet"); } char *c; @@ -2190,11 +2191,11 @@ RNBRemote::HandlePacket_X (const char *p) nub_addr_t addr = strtoull (p, &c, 16); if (errno != 0 && addr == 0) { - return HandlePacket_ILLFORMED ("Invalid address in X packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Invalid address in X packet"); } if (*c != ',') { - return HandlePacket_ILLFORMED ("Comma sep missing in X packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Comma sep missing in X packet"); } /* Advance 'p' to the length part of the packet. */ @@ -2204,7 +2205,7 @@ RNBRemote::HandlePacket_X (const char *p) int length = strtoul (p, NULL, 16); if (errno != 0 && length == 0) { - return HandlePacket_ILLFORMED ("Invalid length in m packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Invalid length in m packet"); } // I think gdb sends a zero length write request to test whether this @@ -2250,7 +2251,7 @@ RNBRemote::HandlePacket_g (const char *p) nub_process_t pid = m_ctx.ProcessID (); nub_thread_t tid = ExtractThreadIDFromThreadSuffix (p + 1); if (tid == INVALID_NUB_THREAD) - return HandlePacket_ILLFORMED ("No thread specified in p packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "No thread specified in p packet"); if (m_use_native_regs) { @@ -2298,7 +2299,7 @@ RNBRemote::HandlePacket_G (const char *p) nub_process_t pid = m_ctx.ProcessID(); nub_thread_t tid = ExtractThreadIDFromThreadSuffix (p); if (tid == INVALID_NUB_THREAD) - return HandlePacket_ILLFORMED ("No thread specified in p packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "No thread specified in p packet"); if (m_use_native_regs) { @@ -2491,7 +2492,7 @@ RNBRemote::HandlePacket_v (const char *p) errno = 0; thread_action.signal = strtoul (c, &c, 16); if (errno != 0) - return HandlePacket_ILLFORMED ("Could not parse signal in vCont packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Could not parse signal in vCont packet"); // Fall through to next case... case 'c': @@ -2503,7 +2504,7 @@ RNBRemote::HandlePacket_v (const char *p) errno = 0; thread_action.signal = strtoul (c, &c, 16); if (errno != 0) - return HandlePacket_ILLFORMED ("Could not parse signal in vCont packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Could not parse signal in vCont packet"); // Fall through to next case... case 's': @@ -2514,7 +2515,7 @@ RNBRemote::HandlePacket_v (const char *p) break; default: - rnb_err = HandlePacket_ILLFORMED ("Unsupported action in vCont packet"); + rnb_err = HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Unsupported action in vCont packet"); break; } if (*c == ':') @@ -2522,7 +2523,7 @@ RNBRemote::HandlePacket_v (const char *p) errno = 0; thread_action.tid = strtoul (++c, &c, 16); if (errno != 0) - return HandlePacket_ILLFORMED ("Could not parse thread number in vCont packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Could not parse thread number in vCont packet"); } thread_actions.Append (thread_action); @@ -2553,7 +2554,7 @@ RNBRemote::HandlePacket_v (const char *p) int ch = strtoul (smallbuf, NULL, 16); if (errno != 0 && ch == 0) { - return HandlePacket_ILLFORMED ("non-hex char in arg on 'vAttachWait' pkt"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "non-hex char in arg on 'vAttachWait' pkt"); } attach_name.push_back(ch); @@ -2578,7 +2579,7 @@ RNBRemote::HandlePacket_v (const char *p) int ch = strtoul (smallbuf, NULL, 16); if (errno != 0 && ch == 0) { - return HandlePacket_ILLFORMED ("non-hex char in arg on 'vAttachWait' pkt"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "non-hex char in arg on 'vAttachWait' pkt"); } attach_name.push_back(ch); @@ -2638,7 +2639,7 @@ RNBRemote::HandlePacket_T (const char *p) p++; if (p == NULL || *p == '\0') { - return HandlePacket_ILLFORMED ("No thread specified in T packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "No thread specified in T packet"); } if (!m_ctx.HasValidProcessID()) { @@ -2648,7 +2649,7 @@ RNBRemote::HandlePacket_T (const char *p) nub_thread_t tid = strtoul (p, NULL, 16); if (errno != 0 && tid == 0) { - return HandlePacket_ILLFORMED ("Could not parse thread number in T packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Could not parse thread number in T packet"); } nub_state_t state = DNBThreadGetState (m_ctx.ProcessID(), tid); @@ -2665,7 +2666,7 @@ rnb_err_t RNBRemote::HandlePacket_z (const char *p) { if (p == NULL || *p == '\0') - return HandlePacket_ILLFORMED ("No thread specified in z packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "No thread specified in z packet"); if (!m_ctx.HasValidProcessID()) return SendPacket ("E15"); @@ -2674,22 +2675,22 @@ RNBRemote::HandlePacket_z (const char *p) char break_type = *p++; if (*p++ != ',') - return HandlePacket_ILLFORMED ("Comma separator missing in z packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Comma separator missing in z packet"); char *c = NULL; nub_process_t pid = m_ctx.ProcessID(); errno = 0; nub_addr_t addr = strtoull (p, &c, 16); if (errno != 0 && addr == 0) - return HandlePacket_ILLFORMED ("Invalid address in z packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Invalid address in z packet"); p = c; if (*p++ != ',') - return HandlePacket_ILLFORMED ("Comma separator missing in z packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Comma separator missing in z packet"); errno = 0; uint32_t byte_size = strtoul (p, &c, 16); if (errno != 0 && byte_size == 0) - return HandlePacket_ILLFORMED ("Invalid length in z packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Invalid length in z packet"); if (packet_cmd == 'Z') { @@ -2912,7 +2913,7 @@ RNBRemote::HandlePacket_p (const char *p) if (p == NULL || *p == '\0') { - return HandlePacket_ILLFORMED ("No thread specified in p packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "No thread specified in p packet"); } if (!m_ctx.HasValidProcessID()) { @@ -2924,12 +2925,12 @@ RNBRemote::HandlePacket_p (const char *p) uint32_t reg = strtoul (p + 1, &tid_cstr, 16); if (errno != 0 && reg == 0) { - return HandlePacket_ILLFORMED ("Could not parse register number in p packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Could not parse register number in p packet"); } nub_thread_t tid = ExtractThreadIDFromThreadSuffix (tid_cstr); if (tid == INVALID_NUB_THREAD) - return HandlePacket_ILLFORMED ("No thread specified in p packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "No thread specified in p packet"); const register_map_entry_t *reg_entry; @@ -2978,7 +2979,7 @@ RNBRemote::HandlePacket_P (const char *p) if (p == NULL || *p == '\0') { - return HandlePacket_ILLFORMED ("Empty P packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Empty P packet"); } if (!m_ctx.HasValidProcessID()) { @@ -2995,7 +2996,7 @@ RNBRemote::HandlePacket_P (const char *p) const char equal_char = packet.GetChar(); if (cmd_char != 'P') - return HandlePacket_ILLFORMED ("Improperly formed P packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Improperly formed P packet"); if (reg == UINT32_MAX) return SendPacket ("E29"); @@ -3022,7 +3023,7 @@ RNBRemote::HandlePacket_P (const char *p) nub_thread_t tid = ExtractThreadIDFromThreadSuffix (p); if (tid == INVALID_NUB_THREAD) - return HandlePacket_ILLFORMED ("No thread specified in p packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "No thread specified in p packet"); if (!DNBThreadSetRegisterValueByID (pid, tid, reg_entry->nub_info.set, reg_entry->nub_info.reg, ®_value)) { @@ -3050,7 +3051,7 @@ RNBRemote::HandlePacket_c (const char *p) errno = 0; action.addr = strtoull (p + 1, NULL, 16); if (errno != 0 && action.addr == 0) - return HandlePacket_ILLFORMED ("Could not parse address in c packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Could not parse address in c packet"); } DNBThreadResumeActions thread_actions; @@ -3082,13 +3083,13 @@ RNBRemote::HandlePacket_C (const char *p) errno = 0; process_signo = strtoul (p + 1, &end, 16); if (errno != 0) - return HandlePacket_ILLFORMED ("Could not parse signal in C packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Could not parse signal in C packet"); else if (*end == ';') { errno = 0; action.addr = strtoull (end + 1, NULL, 16); if (errno != 0 && action.addr == 0) - return HandlePacket_ILLFORMED ("Could not parse address in C packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Could not parse address in C packet"); } } @@ -3186,14 +3187,14 @@ RNBRemote::HandlePacket_S (const char *p) errno = 0; action.signal = strtoul (p + 1, &end, 16); if (errno != 0) - return HandlePacket_ILLFORMED ("Could not parse signal in S packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Could not parse signal in S packet"); else if (*end == ';') { errno = 0; action.addr = strtoull (end + 1, NULL, 16); if (errno != 0 && action.addr == 0) { - return HandlePacket_ILLFORMED ("Could not parse address in S packet"); + return HandlePacket_ILLFORMED (__FILE__, __LINE__, p, "Could not parse address in S packet"); } } } diff --git a/lldb/tools/debugserver/source/RNBRemote.h b/lldb/tools/debugserver/source/RNBRemote.h index 82febf7d226..e3a968f9d82 100644 --- a/lldb/tools/debugserver/source/RNBRemote.h +++ b/lldb/tools/debugserver/source/RNBRemote.h @@ -183,7 +183,7 @@ public: rnb_err_t HandlePacket_S (const char *p); rnb_err_t HandlePacket_v (const char *p); rnb_err_t HandlePacket_UNIMPLEMENTED (const char *p); - rnb_err_t HandlePacket_ILLFORMED (const char *description); + rnb_err_t HandlePacket_ILLFORMED (const char *file, int line, const char *p, const char *description); rnb_err_t HandlePacket_AllocateMemory (const char *p); rnb_err_t HandlePacket_DeallocateMemory (const char *p); |