summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
diff options
context:
space:
mode:
authorGreg Clayton <gclayton@apple.com>2011-01-29 07:10:55 +0000
committerGreg Clayton <gclayton@apple.com>2011-01-29 07:10:55 +0000
commit513c26ce9ddebe5adbcb068e88b452a904ee6f8d (patch)
tree4b06c857d67e39f2202c1fee7af2237029b93c8f /lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
parentfd4834061c5b1e6e056d0d53da72980ae44b638e (diff)
downloadbcm5719-llvm-513c26ce9ddebe5adbcb068e88b452a904ee6f8d.tar.gz
bcm5719-llvm-513c26ce9ddebe5adbcb068e88b452a904ee6f8d.zip
Finished up the async attach support. This allows us to request to attach
by name or by pid (with or without waiting for a process to launch) and catch the response asynchronously. llvm-svn: 124530
Diffstat (limited to 'lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp')
-rw-r--r--lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp186
1 files changed, 53 insertions, 133 deletions
diff --git a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
index afaf3744c0e..d50c57a3fd2 100644
--- a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
+++ b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
@@ -184,18 +184,22 @@ ProcessGDBRemote::EnablePluginLogging (Stream *strm, Args &command)
}
void
-ProcessGDBRemote::BuildDynamicRegisterInfo ()
+ProcessGDBRemote::BuildDynamicRegisterInfo (bool force)
{
- char register_info_command[64];
+ if (!force && m_register_info.GetNumRegisters() > 0)
+ return;
+
+ char packet[128];
m_register_info.Clear();
StringExtractorGDBRemote::Type packet_type = StringExtractorGDBRemote::eResponse;
uint32_t reg_offset = 0;
uint32_t reg_num = 0;
for (; packet_type == StringExtractorGDBRemote::eResponse; ++reg_num)
{
- ::snprintf (register_info_command, sizeof(register_info_command), "qRegisterInfo%x", reg_num);
+ const int packet_len = ::snprintf (packet, sizeof(packet), "qRegisterInfo%x", reg_num);
+ assert (packet_len < sizeof(packet));
StringExtractorGDBRemote response;
- if (m_gdb_comm.SendPacketAndWaitForResponse(register_info_command, response, 2, false))
+ if (m_gdb_comm.SendPacketAndWaitForResponse(packet, packet_len, response, 2, false))
{
packet_type = response.GetType();
if (packet_type == StringExtractorGDBRemote::eResponse)
@@ -586,7 +590,7 @@ ProcessGDBRemote::DidLaunchOrAttach ()
{
m_dispatch_queue_offsets_addr = LLDB_INVALID_ADDRESS;
- BuildDynamicRegisterInfo ();
+ BuildDynamicRegisterInfo (false);
m_byte_order = m_gdb_comm.GetByteOrder();
@@ -677,43 +681,11 @@ ProcessGDBRemote::DoAttachToProcessWithID (lldb::pid_t attach_pid)
{
char packet[64];
const int packet_len = ::snprintf (packet, sizeof(packet), "vAttach;%x", attach_pid);
- StringExtractorGDBRemote response;
- StateType stop_state = m_gdb_comm.SendContinuePacketAndWaitForResponse (this,
- packet,
- packet_len,
- response);
- switch (stop_state)
- {
- case eStateStopped:
- case eStateCrashed:
- case eStateSuspended:
- SetID (attach_pid);
- m_last_stop_packet = response;
- m_last_stop_packet.SetFilePos (0);
- SetPrivateState (stop_state);
- break;
-
- case eStateExited:
- m_last_stop_packet = response;
- m_last_stop_packet.SetFilePos (0);
- response.SetFilePos(1);
- SetExitStatus(response.GetHexU8(), NULL);
- break;
-
- default:
- SetExitStatus(-1, "unable to attach to process");
- break;
- }
-
+
+ m_async_broadcaster.BroadcastEvent (eBroadcastBitAsyncContinue, new EventDataBytes (packet, packet_len));
}
}
}
-
- lldb::pid_t pid = GetID();
- if (pid == LLDB_INVALID_PROCESS_ID)
- {
- KillDebugserverProcess();
- }
return error;
}
@@ -787,86 +759,15 @@ ProcessGDBRemote::DoAttachToProcessWithName (const char *process_name, bool wait
packet.PutCString("vAttachName");
packet.PutChar(';');
packet.PutBytesAsRawHex8(process_name, strlen(process_name), eByteOrderHost, eByteOrderHost);
- StringExtractorGDBRemote response;
- StateType stop_state = m_gdb_comm.SendContinuePacketAndWaitForResponse (this,
- packet.GetData(),
- packet.GetSize(),
- response);
- switch (stop_state)
- {
- case eStateStopped:
- case eStateCrashed:
- case eStateSuspended:
- SetID (m_gdb_comm.GetCurrentProcessID(m_packet_timeout));
- m_last_stop_packet = response;
- m_last_stop_packet.SetFilePos (0);
- SetPrivateState (stop_state);
- break;
-
- case eStateExited:
- m_last_stop_packet = response;
- m_last_stop_packet.SetFilePos (0);
- response.SetFilePos(1);
- SetExitStatus(response.GetHexU8(), NULL);
- break;
+
+ m_async_broadcaster.BroadcastEvent (eBroadcastBitAsyncContinue, new EventDataBytes (packet.GetData(), packet.GetSize()));
- default:
- SetExitStatus(-1, "unable to attach to process");
- break;
- }
}
}
}
-
- lldb::pid_t pid = GetID();
- if (pid == LLDB_INVALID_PROCESS_ID)
- {
- KillDebugserverProcess();
-
- if (error.Success())
- error.SetErrorStringWithFormat("unable to attach to process named '%s'", process_name);
- }
-
return error;
}
-//
-// if (wait_for_launch)
-// {
-// InputReaderSP reader_sp (new InputReader());
-// StreamString instructions;
-// instructions.Printf("Hit any key to cancel waiting for '%s' to launch...", process_name);
-// error = reader_sp->Initialize (AttachInputReaderCallback, // callback
-// this, // baton
-// eInputReaderGranularityByte,
-// NULL, // End token
-// false);
-//
-// StringExtractorGDBRemote response;
-// m_waiting_for_attach = true;
-// FILE *reader_out_fh = reader_sp->GetOutputFileHandle();
-// while (m_waiting_for_attach)
-// {
-// // Wait for one second for the stop reply packet
-// if (m_gdb_comm.WaitForPacket(response, 1))
-// {
-// // Got some sort of packet, see if it is the stop reply packet?
-// char ch = response.GetChar(0);
-// if (ch == 'T')
-// {
-// m_waiting_for_attach = false;
-// }
-// }
-// else
-// {
-// // Put a period character every second
-// fputc('.', reader_out_fh);
-// }
-// }
-// }
-// }
-// return GetID();
-//}
void
ProcessGDBRemote::DidAttach ()
@@ -1158,15 +1059,23 @@ ProcessGDBRemote::DoHalt (bool &caused_stop)
bool timed_out = false;
Mutex::Locker locker;
-
- if (!m_gdb_comm.SendInterrupt (locker, 2, caused_stop, timed_out))
+
+ if (m_public_state.GetValue() == eStateAttaching)
{
- if (timed_out)
- error.SetErrorString("timed out sending interrupt packet");
- else
- error.SetErrorString("unknown error sending interrupt packet");
+ // We are being asked to halt during an attach. We need to just close
+ // our file handle and debugserver will go away, and we can be done...
+ m_gdb_comm.Disconnect();
+ }
+ else
+ {
+ if (!m_gdb_comm.SendInterrupt (locker, 2, caused_stop, timed_out))
+ {
+ if (timed_out)
+ error.SetErrorString("timed out sending interrupt packet");
+ else
+ error.SetErrorString("unknown error sending interrupt packet");
+ }
}
-
return error;
}
@@ -1305,22 +1214,32 @@ ProcessGDBRemote::DoDestroy ()
// Interrupt if our inferior is running...
if (m_gdb_comm.IsConnected())
{
- StringExtractorGDBRemote response;
- bool send_async = true;
- if (m_gdb_comm.SendPacketAndWaitForResponse("k", 1, response, 2, send_async))
+ if (m_public_state.GetValue() == eStateAttaching)
{
- char packet_cmd = response.GetChar(0);
-
- if (packet_cmd == 'W' || packet_cmd == 'X')
- {
- m_last_stop_packet = response;
- SetExitStatus(response.GetHexU8(), NULL);
- }
+ // We are being asked to halt during an attach. We need to just close
+ // our file handle and debugserver will go away, and we can be done...
+ m_gdb_comm.Disconnect();
}
else
{
- SetExitStatus(SIGABRT, NULL);
- //error.SetErrorString("kill packet failed");
+
+ StringExtractorGDBRemote response;
+ bool send_async = true;
+ if (m_gdb_comm.SendPacketAndWaitForResponse("k", 1, response, 2, send_async))
+ {
+ char packet_cmd = response.GetChar(0);
+
+ if (packet_cmd == 'W' || packet_cmd == 'X')
+ {
+ m_last_stop_packet = response;
+ SetExitStatus(response.GetHexU8(), NULL);
+ }
+ }
+ else
+ {
+ SetExitStatus(SIGABRT, NULL);
+ //error.SetErrorString("kill packet failed");
+ }
}
}
StopAsyncThread ();
@@ -1951,7 +1870,7 @@ ProcessGDBRemote::StartDebugserverProcess
debugserver_args.AppendArgument(arg_cstr);
}
// debugserver_args.AppendArgument("--log-file=/tmp/debugserver.txt");
-// debugserver_args.AppendArgument("--log-flags=0x800e0e");
+// debugserver_args.AppendArgument("--log-flags=0x802e0e");
// Now append the program arguments
if (launch_process)
@@ -2268,7 +2187,8 @@ ProcessGDBRemote::AsyncThread (void *arg)
if (log)
log->Printf ("ProcessGDBRemote::%s (arg = %p, pid = %i) got eBroadcastBitAsyncContinue: %s", __FUNCTION__, arg, process->GetID(), continue_cstr);
- process->SetPrivateState(eStateRunning);
+ if (::strstr (continue_cstr, "vAttach") == NULL)
+ process->SetPrivateState(eStateRunning);
StringExtractorGDBRemote response;
StateType stop_state = process->GetGDBRemote().SendContinuePacketAndWaitForResponse (process, continue_cstr, continue_cstr_len, response);
OpenPOWER on IntegriCloud