ProcessGDBRemote.cpp revision 4fa015bc1c2d81f702f9be28420959cb52f214c3
1//===-- ProcessGDBRemote.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// C Includes
11#include <errno.h>
12#include <spawn.h>
13#include <stdlib.h>
14#include <netinet/in.h>
15#include <sys/mman.h>       // for mmap
16#include <sys/stat.h>
17#include <sys/types.h>
18#include <time.h>
19
20// C++ Includes
21#include <algorithm>
22#include <map>
23
24// Other libraries and framework includes
25
26#include "lldb/Breakpoint/Watchpoint.h"
27#include "lldb/Interpreter/Args.h"
28#include "lldb/Core/ArchSpec.h"
29#include "lldb/Core/Debugger.h"
30#include "lldb/Core/ConnectionFileDescriptor.h"
31#include "lldb/Host/FileSpec.h"
32#include "lldb/Core/InputReader.h"
33#include "lldb/Core/Module.h"
34#include "lldb/Core/ModuleSpec.h"
35#include "lldb/Core/PluginManager.h"
36#include "lldb/Core/State.h"
37#include "lldb/Core/StreamFile.h"
38#include "lldb/Core/StreamString.h"
39#include "lldb/Core/Timer.h"
40#include "lldb/Core/Value.h"
41#include "lldb/Host/Symbols.h"
42#include "lldb/Host/TimeValue.h"
43#include "lldb/Interpreter/CommandInterpreter.h"
44#include "lldb/Interpreter/CommandObject.h"
45#include "lldb/Interpreter/CommandObjectMultiword.h"
46#include "lldb/Interpreter/CommandReturnObject.h"
47#include "lldb/Symbol/ObjectFile.h"
48#include "lldb/Target/DynamicLoader.h"
49#include "lldb/Target/Target.h"
50#include "lldb/Target/TargetList.h"
51#include "lldb/Target/ThreadPlanCallFunction.h"
52#include "lldb/Utility/PseudoTerminal.h"
53
54// Project includes
55#include "lldb/Host/Host.h"
56#include "Plugins/Process/Utility/InferiorCallPOSIX.h"
57#include "Plugins/Process/Utility/StopInfoMachException.h"
58#include "Plugins/Platform/MacOSX/PlatformRemoteiOS.h"
59#include "Utility/StringExtractorGDBRemote.h"
60#include "GDBRemoteRegisterContext.h"
61#include "ProcessGDBRemote.h"
62#include "ProcessGDBRemoteLog.h"
63#include "ThreadGDBRemote.h"
64
65#include "Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.h"
66
67namespace lldb
68{
69    // Provide a function that can easily dump the packet history if we know a
70    // ProcessGDBRemote * value (which we can get from logs or from debugging).
71    // We need the function in the lldb namespace so it makes it into the final
72    // executable since the LLDB shared library only exports stuff in the lldb
73    // namespace. This allows you to attach with a debugger and call this
74    // function and get the packet history dumped to a file.
75    void
76    DumpProcessGDBRemotePacketHistory (void *p, const char *path)
77    {
78        lldb_private::StreamFile strm;
79        lldb_private::Error error (strm.GetFile().Open(path, lldb_private::File::eOpenOptionWrite | lldb_private::File::eOpenOptionCanCreate));
80        if (error.Success())
81            ((ProcessGDBRemote *)p)->GetGDBRemote().DumpHistory (strm);
82    }
83}
84
85
86#define DEBUGSERVER_BASENAME    "debugserver"
87using namespace lldb;
88using namespace lldb_private;
89
90static bool rand_initialized = false;
91
92// TODO Randomly assigning a port is unsafe.  We should get an unused
93// ephemeral port from the kernel and make sure we reserve it before passing
94// it to debugserver.
95
96#if defined (__APPLE__)
97#define LOW_PORT    (IPPORT_RESERVED)
98#define HIGH_PORT   (IPPORT_HIFIRSTAUTO)
99#else
100#define LOW_PORT    (1024u)
101#define HIGH_PORT   (49151u)
102#endif
103
104static inline uint16_t
105get_random_port ()
106{
107    if (!rand_initialized)
108    {
109        time_t seed = time(NULL);
110
111        rand_initialized = true;
112        srand(seed);
113    }
114    return (rand() % (HIGH_PORT - LOW_PORT)) + LOW_PORT;
115}
116
117
118const char *
119ProcessGDBRemote::GetPluginNameStatic()
120{
121    return "gdb-remote";
122}
123
124const char *
125ProcessGDBRemote::GetPluginDescriptionStatic()
126{
127    return "GDB Remote protocol based debugging plug-in.";
128}
129
130void
131ProcessGDBRemote::Terminate()
132{
133    PluginManager::UnregisterPlugin (ProcessGDBRemote::CreateInstance);
134}
135
136
137lldb::ProcessSP
138ProcessGDBRemote::CreateInstance (Target &target, Listener &listener, const FileSpec *crash_file_path)
139{
140    lldb::ProcessSP process_sp;
141    if (crash_file_path == NULL)
142        process_sp.reset (new ProcessGDBRemote (target, listener));
143    return process_sp;
144}
145
146bool
147ProcessGDBRemote::CanDebug (Target &target, bool plugin_specified_by_name)
148{
149    if (plugin_specified_by_name)
150        return true;
151
152    // For now we are just making sure the file exists for a given module
153    Module *exe_module = target.GetExecutableModulePointer();
154    if (exe_module)
155    {
156        ObjectFile *exe_objfile = exe_module->GetObjectFile();
157        // We can't debug core files...
158        switch (exe_objfile->GetType())
159        {
160            case ObjectFile::eTypeInvalid:
161            case ObjectFile::eTypeCoreFile:
162            case ObjectFile::eTypeDebugInfo:
163            case ObjectFile::eTypeObjectFile:
164            case ObjectFile::eTypeSharedLibrary:
165            case ObjectFile::eTypeStubLibrary:
166                return false;
167            case ObjectFile::eTypeExecutable:
168            case ObjectFile::eTypeDynamicLinker:
169            case ObjectFile::eTypeUnknown:
170                break;
171        }
172        return exe_module->GetFileSpec().Exists();
173    }
174    // However, if there is no executable module, we return true since we might be preparing to attach.
175    return true;
176}
177
178//----------------------------------------------------------------------
179// ProcessGDBRemote constructor
180//----------------------------------------------------------------------
181ProcessGDBRemote::ProcessGDBRemote(Target& target, Listener &listener) :
182    Process (target, listener),
183    m_flags (0),
184    m_gdb_comm(false),
185    m_debugserver_pid (LLDB_INVALID_PROCESS_ID),
186    m_last_stop_packet (),
187    m_last_stop_packet_mutex (Mutex::eMutexTypeNormal),
188    m_register_info (),
189    m_async_broadcaster (NULL, "lldb.process.gdb-remote.async-broadcaster"),
190    m_async_thread (LLDB_INVALID_HOST_THREAD),
191    m_thread_ids (),
192    m_continue_c_tids (),
193    m_continue_C_tids (),
194    m_continue_s_tids (),
195    m_continue_S_tids (),
196    m_dispatch_queue_offsets_addr (LLDB_INVALID_ADDRESS),
197    m_max_memory_size (512),
198    m_addr_to_mmap_size (),
199    m_thread_create_bp_sp (),
200    m_waiting_for_attach (false),
201    m_destroy_tried_resuming (false),
202    m_dyld_plugin_name(),
203    m_kernel_load_addr (LLDB_INVALID_ADDRESS),
204    m_command_sp ()
205{
206    m_async_broadcaster.SetEventName (eBroadcastBitAsyncThreadShouldExit,   "async thread should exit");
207    m_async_broadcaster.SetEventName (eBroadcastBitAsyncContinue,           "async thread continue");
208    m_async_broadcaster.SetEventName (eBroadcastBitAsyncThreadDidExit,      "async thread did exit");
209}
210
211//----------------------------------------------------------------------
212// Destructor
213//----------------------------------------------------------------------
214ProcessGDBRemote::~ProcessGDBRemote()
215{
216    //  m_mach_process.UnregisterNotificationCallbacks (this);
217    Clear();
218    // We need to call finalize on the process before destroying ourselves
219    // to make sure all of the broadcaster cleanup goes as planned. If we
220    // destruct this class, then Process::~Process() might have problems
221    // trying to fully destroy the broadcaster.
222    Finalize();
223}
224
225//----------------------------------------------------------------------
226// PluginInterface
227//----------------------------------------------------------------------
228const char *
229ProcessGDBRemote::GetPluginName()
230{
231    return "Process debugging plug-in that uses the GDB remote protocol";
232}
233
234const char *
235ProcessGDBRemote::GetShortPluginName()
236{
237    return GetPluginNameStatic();
238}
239
240uint32_t
241ProcessGDBRemote::GetPluginVersion()
242{
243    return 1;
244}
245
246void
247ProcessGDBRemote::BuildDynamicRegisterInfo (bool force)
248{
249    if (!force && m_register_info.GetNumRegisters() > 0)
250        return;
251
252    char packet[128];
253    m_register_info.Clear();
254    uint32_t reg_offset = 0;
255    uint32_t reg_num = 0;
256    for (StringExtractorGDBRemote::ResponseType response_type = StringExtractorGDBRemote::eResponse;
257         response_type == StringExtractorGDBRemote::eResponse;
258         ++reg_num)
259    {
260        const int packet_len = ::snprintf (packet, sizeof(packet), "qRegisterInfo%x", reg_num);
261        assert (packet_len < sizeof(packet));
262        StringExtractorGDBRemote response;
263        if (m_gdb_comm.SendPacketAndWaitForResponse(packet, packet_len, response, false))
264        {
265            response_type = response.GetResponseType();
266            if (response_type == StringExtractorGDBRemote::eResponse)
267            {
268                std::string name;
269                std::string value;
270                ConstString reg_name;
271                ConstString alt_name;
272                ConstString set_name;
273                RegisterInfo reg_info = { NULL,                 // Name
274                    NULL,                 // Alt name
275                    0,                    // byte size
276                    reg_offset,           // offset
277                    eEncodingUint,        // encoding
278                    eFormatHex,           // formate
279                    {
280                        LLDB_INVALID_REGNUM, // GCC reg num
281                        LLDB_INVALID_REGNUM, // DWARF reg num
282                        LLDB_INVALID_REGNUM, // generic reg num
283                        reg_num,             // GDB reg num
284                        reg_num           // native register number
285                    },
286                    NULL,
287                    NULL
288                };
289
290                while (response.GetNameColonValue(name, value))
291                {
292                    if (name.compare("name") == 0)
293                    {
294                        reg_name.SetCString(value.c_str());
295                    }
296                    else if (name.compare("alt-name") == 0)
297                    {
298                        alt_name.SetCString(value.c_str());
299                    }
300                    else if (name.compare("bitsize") == 0)
301                    {
302                        reg_info.byte_size = Args::StringToUInt32(value.c_str(), 0, 0) / CHAR_BIT;
303                    }
304                    else if (name.compare("offset") == 0)
305                    {
306                        uint32_t offset = Args::StringToUInt32(value.c_str(), UINT32_MAX, 0);
307                        if (reg_offset != offset)
308                        {
309                            reg_offset = offset;
310                        }
311                    }
312                    else if (name.compare("encoding") == 0)
313                    {
314                        const Encoding encoding = Args::StringToEncoding (value.c_str());
315                        if (encoding != eEncodingInvalid)
316                            reg_info.encoding = encoding;
317                    }
318                    else if (name.compare("format") == 0)
319                    {
320                        Format format = eFormatInvalid;
321                        if (Args::StringToFormat (value.c_str(), format, NULL).Success())
322                            reg_info.format = format;
323                        else if (value.compare("binary") == 0)
324                            reg_info.format = eFormatBinary;
325                        else if (value.compare("decimal") == 0)
326                            reg_info.format = eFormatDecimal;
327                        else if (value.compare("hex") == 0)
328                            reg_info.format = eFormatHex;
329                        else if (value.compare("float") == 0)
330                            reg_info.format = eFormatFloat;
331                        else if (value.compare("vector-sint8") == 0)
332                            reg_info.format = eFormatVectorOfSInt8;
333                        else if (value.compare("vector-uint8") == 0)
334                            reg_info.format = eFormatVectorOfUInt8;
335                        else if (value.compare("vector-sint16") == 0)
336                            reg_info.format = eFormatVectorOfSInt16;
337                        else if (value.compare("vector-uint16") == 0)
338                            reg_info.format = eFormatVectorOfUInt16;
339                        else if (value.compare("vector-sint32") == 0)
340                            reg_info.format = eFormatVectorOfSInt32;
341                        else if (value.compare("vector-uint32") == 0)
342                            reg_info.format = eFormatVectorOfUInt32;
343                        else if (value.compare("vector-float32") == 0)
344                            reg_info.format = eFormatVectorOfFloat32;
345                        else if (value.compare("vector-uint128") == 0)
346                            reg_info.format = eFormatVectorOfUInt128;
347                    }
348                    else if (name.compare("set") == 0)
349                    {
350                        set_name.SetCString(value.c_str());
351                    }
352                    else if (name.compare("gcc") == 0)
353                    {
354                        reg_info.kinds[eRegisterKindGCC] = Args::StringToUInt32(value.c_str(), LLDB_INVALID_REGNUM, 0);
355                    }
356                    else if (name.compare("dwarf") == 0)
357                    {
358                        reg_info.kinds[eRegisterKindDWARF] = Args::StringToUInt32(value.c_str(), LLDB_INVALID_REGNUM, 0);
359                    }
360                    else if (name.compare("generic") == 0)
361                    {
362                        reg_info.kinds[eRegisterKindGeneric] = Args::StringToGenericRegister (value.c_str());
363                    }
364                }
365
366                reg_info.byte_offset = reg_offset;
367                assert (reg_info.byte_size != 0);
368                reg_offset += reg_info.byte_size;
369                m_register_info.AddRegister(reg_info, reg_name, alt_name, set_name);
370            }
371        }
372        else
373        {
374            break;
375        }
376    }
377
378    // We didn't get anything if the accumulated reg_num is zero.  See if we are
379    // debugging ARM and fill with a hard coded register set until we can get an
380    // updated debugserver down on the devices.
381    // On the other hand, if the accumulated reg_num is positive, see if we can
382    // add composite registers to the existing primordial ones.
383    bool from_scratch = (reg_num == 0);
384
385    const ArchSpec &target_arch = GetTarget().GetArchitecture();
386    const ArchSpec &remote_arch = m_gdb_comm.GetHostArchitecture();
387    if (!target_arch.IsValid())
388    {
389        if (remote_arch.IsValid()
390              && remote_arch.GetMachine() == llvm::Triple::arm
391              && remote_arch.GetTriple().getVendor() == llvm::Triple::Apple)
392            m_register_info.HardcodeARMRegisters(from_scratch);
393    }
394    else if (target_arch.GetMachine() == llvm::Triple::arm)
395    {
396        m_register_info.HardcodeARMRegisters(from_scratch);
397    }
398
399    // Add some convenience registers (eax, ebx, ecx, edx, esi, edi, ebp, esp) to x86_64.
400    if ((target_arch.IsValid() && target_arch.GetMachine() == llvm::Triple::x86_64)
401        || (remote_arch.IsValid() && remote_arch.GetMachine() == llvm::Triple::x86_64))
402        m_register_info.Addx86_64ConvenienceRegisters();
403
404    // At this point, we can finalize our register info.
405    m_register_info.Finalize ();
406}
407
408Error
409ProcessGDBRemote::WillLaunch (Module* module)
410{
411    return WillLaunchOrAttach ();
412}
413
414Error
415ProcessGDBRemote::WillAttachToProcessWithID (lldb::pid_t pid)
416{
417    return WillLaunchOrAttach ();
418}
419
420Error
421ProcessGDBRemote::WillAttachToProcessWithName (const char *process_name, bool wait_for_launch)
422{
423    return WillLaunchOrAttach ();
424}
425
426Error
427ProcessGDBRemote::DoConnectRemote (Stream *strm, const char *remote_url)
428{
429    Error error (WillLaunchOrAttach ());
430
431    if (error.Fail())
432        return error;
433
434    error = ConnectToDebugserver (remote_url);
435
436    if (error.Fail())
437        return error;
438    StartAsyncThread ();
439
440    CheckForKernel (strm);
441
442    lldb::pid_t pid = m_gdb_comm.GetCurrentProcessID ();
443    if (pid == LLDB_INVALID_PROCESS_ID)
444    {
445        // We don't have a valid process ID, so note that we are connected
446        // and could now request to launch or attach, or get remote process
447        // listings...
448        SetPrivateState (eStateConnected);
449    }
450    else
451    {
452        // We have a valid process
453        SetID (pid);
454        GetThreadList();
455        if (m_gdb_comm.SendPacketAndWaitForResponse("?", 1, m_last_stop_packet, false))
456        {
457            const StateType state = SetThreadStopInfo (m_last_stop_packet);
458            if (state == eStateStopped)
459            {
460                SetPrivateState (state);
461            }
462            else
463                error.SetErrorStringWithFormat ("Process %llu was reported after connecting to '%s', but state was not stopped: %s", pid, remote_url, StateAsCString (state));
464        }
465        else
466            error.SetErrorStringWithFormat ("Process %llu was reported after connecting to '%s', but no stop reply packet was received", pid, remote_url);
467    }
468
469    if (error.Success()
470        && !GetTarget().GetArchitecture().IsValid()
471        && m_gdb_comm.GetHostArchitecture().IsValid())
472    {
473        GetTarget().SetArchitecture(m_gdb_comm.GetHostArchitecture());
474    }
475
476    return error;
477}
478
479// When we are establishing a connection to a remote system and we have no executable specified,
480// or the executable is a kernel, we may be looking at a KASLR situation (where the kernel has been
481// slid in memory.)
482//
483// This function tries to locate the kernel in memory if this is possibly a kernel debug session.
484//
485// If a kernel is found, return the address of the kernel in GetImageInfoAddress() -- the
486// DynamicLoaderDarwinKernel plugin uses this address as the kernel load address and will load the
487// binary, if needed, along with all the kexts.
488
489void
490ProcessGDBRemote::CheckForKernel (Stream *strm)
491{
492    // early return if this isn't an "unknown" system (kernel debugging doesn't have a system type)
493    const ArchSpec &gdb_remote_arch = m_gdb_comm.GetHostArchitecture();
494    if (!gdb_remote_arch.IsValid() || gdb_remote_arch.GetTriple().getVendor() != llvm::Triple::UnknownVendor)
495        return;
496
497    Module *exe_module = GetTarget().GetExecutableModulePointer();
498    ObjectFile *exe_objfile = NULL;
499    if (exe_module)
500        exe_objfile = exe_module->GetObjectFile();
501
502    // early return if we have an executable and it is not a kernel--this is very unlikely to be a kernel debug session.
503    if (exe_objfile
504        && (exe_objfile->GetType() != ObjectFile::eTypeExecutable
505            || exe_objfile->GetStrata() != ObjectFile::eStrataKernel))
506        return;
507
508    // See if the kernel is in memory at the File address (slide == 0) -- no work needed, if so.
509    if (exe_objfile && exe_objfile->GetHeaderAddress().IsValid())
510    {
511        ModuleSP memory_module_sp;
512        memory_module_sp = ReadModuleFromMemory (exe_module->GetFileSpec(), exe_objfile->GetHeaderAddress().GetFileAddress(), false, false);
513        if (memory_module_sp.get()
514            && memory_module_sp->GetUUID().IsValid()
515            && memory_module_sp->GetUUID() == exe_module->GetUUID())
516        {
517            m_kernel_load_addr = exe_objfile->GetHeaderAddress().GetFileAddress();
518            m_dyld_plugin_name = DynamicLoaderDarwinKernel::GetPluginNameStatic();
519            SetCanJIT(false);
520            return;
521        }
522    }
523
524    // See if the kernel's load address is stored in the kernel's low globals page; this is
525    // done when a debug boot-arg has been set.
526
527    Error error;
528    uint8_t buf[24];
529    ModuleSP memory_module_sp;
530    addr_t kernel_addr = LLDB_INVALID_ADDRESS;
531
532    // First try the 32-bit
533    if (memory_module_sp.get() == NULL)
534    {
535        DataExtractor data4 (buf, sizeof(buf), gdb_remote_arch.GetByteOrder(), 4);
536        if (DoReadMemory (0xffff0110, buf, 4, error) == 4)
537        {
538            uint32_t offset = 0;
539            kernel_addr = data4.GetU32(&offset);
540            memory_module_sp = ReadModuleFromMemory (FileSpec("mach_kernel", false), kernel_addr, false, false);
541            if (!memory_module_sp.get()
542                || !memory_module_sp->GetUUID().IsValid()
543                || memory_module_sp->GetObjectFile() == NULL
544                || memory_module_sp->GetObjectFile()->GetType() != ObjectFile::eTypeExecutable
545                || memory_module_sp->GetObjectFile()->GetStrata() != ObjectFile::eStrataKernel)
546            {
547                memory_module_sp.reset();
548            }
549        }
550    }
551
552    // Now try the 64-bit location
553    if (memory_module_sp.get() == NULL)
554    {
555        DataExtractor data8 (buf, sizeof(buf), gdb_remote_arch.GetByteOrder(), 8);
556        if (DoReadMemory (0xffffff8000002010ULL, buf, 8, error) == 8)
557        {
558            uint32_t offset = 0;
559            kernel_addr = data8.GetU32(&offset);
560            memory_module_sp = ReadModuleFromMemory (FileSpec("mach_kernel", false), kernel_addr, false, false);
561            if (!memory_module_sp.get()
562                || !memory_module_sp->GetUUID().IsValid()
563                || memory_module_sp->GetObjectFile() == NULL
564                || memory_module_sp->GetObjectFile()->GetType() != ObjectFile::eTypeExecutable
565                || memory_module_sp->GetObjectFile()->GetStrata() != ObjectFile::eStrataKernel)
566            {
567                memory_module_sp.reset();
568            }
569        }
570    }
571
572    if (memory_module_sp.get()
573        && memory_module_sp->GetArchitecture().IsValid()
574        && memory_module_sp->GetArchitecture().GetTriple().getVendor() == llvm::Triple::Apple)
575    {
576        m_kernel_load_addr = kernel_addr;
577        m_dyld_plugin_name = DynamicLoaderDarwinKernel::GetPluginNameStatic();
578        SetCanJIT(false);
579        return;
580    }
581}
582
583Error
584ProcessGDBRemote::WillLaunchOrAttach ()
585{
586    Error error;
587    m_stdio_communication.Clear ();
588    return error;
589}
590
591//----------------------------------------------------------------------
592// Process Control
593//----------------------------------------------------------------------
594Error
595ProcessGDBRemote::DoLaunch (Module *exe_module, const ProcessLaunchInfo &launch_info)
596{
597    Error error;
598
599    uint32_t launch_flags = launch_info.GetFlags().Get();
600    const char *stdin_path = NULL;
601    const char *stdout_path = NULL;
602    const char *stderr_path = NULL;
603    const char *working_dir = launch_info.GetWorkingDirectory();
604
605    const ProcessLaunchInfo::FileAction *file_action;
606    file_action = launch_info.GetFileActionForFD (STDIN_FILENO);
607    if (file_action)
608    {
609        if (file_action->GetAction () == ProcessLaunchInfo::FileAction::eFileActionOpen)
610            stdin_path = file_action->GetPath();
611    }
612    file_action = launch_info.GetFileActionForFD (STDOUT_FILENO);
613    if (file_action)
614    {
615        if (file_action->GetAction () == ProcessLaunchInfo::FileAction::eFileActionOpen)
616            stdout_path = file_action->GetPath();
617    }
618    file_action = launch_info.GetFileActionForFD (STDERR_FILENO);
619    if (file_action)
620    {
621        if (file_action->GetAction () == ProcessLaunchInfo::FileAction::eFileActionOpen)
622            stderr_path = file_action->GetPath();
623    }
624
625    //  ::LogSetBitMask (GDBR_LOG_DEFAULT);
626    //  ::LogSetOptions (LLDB_LOG_OPTION_THREADSAFE | LLDB_LOG_OPTION_PREPEND_TIMESTAMP | LLDB_LOG_OPTION_PREPEND_PROC_AND_THREAD);
627    //  ::LogSetLogFile ("/dev/stdout");
628    LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS));
629
630    ObjectFile * object_file = exe_module->GetObjectFile();
631    if (object_file)
632    {
633        char host_port[128];
634        snprintf (host_port, sizeof(host_port), "localhost:%u", get_random_port ());
635        char connect_url[128];
636        snprintf (connect_url, sizeof(connect_url), "connect://%s", host_port);
637
638        // Make sure we aren't already connected?
639        if (!m_gdb_comm.IsConnected())
640        {
641            error = StartDebugserverProcess (host_port, launch_info);
642            if (error.Fail())
643            {
644                if (log)
645                    log->Printf("failed to start debugserver process: %s", error.AsCString());
646                return error;
647            }
648
649            error = ConnectToDebugserver (connect_url);
650        }
651
652        if (error.Success())
653        {
654            lldb_utility::PseudoTerminal pty;
655            const bool disable_stdio = (launch_flags & eLaunchFlagDisableSTDIO) != 0;
656
657            // If the debugserver is local and we aren't disabling STDIO, lets use
658            // a pseudo terminal to instead of relying on the 'O' packets for stdio
659            // since 'O' packets can really slow down debugging if the inferior
660            // does a lot of output.
661            PlatformSP platform_sp (m_target.GetPlatform());
662            if (platform_sp && platform_sp->IsHost() && !disable_stdio)
663            {
664                const char *slave_name = NULL;
665                if (stdin_path == NULL || stdout_path == NULL || stderr_path == NULL)
666                {
667                    if (pty.OpenFirstAvailableMaster(O_RDWR|O_NOCTTY, NULL, 0))
668                        slave_name = pty.GetSlaveName (NULL, 0);
669                }
670                if (stdin_path == NULL)
671                    stdin_path = slave_name;
672
673                if (stdout_path == NULL)
674                    stdout_path = slave_name;
675
676                if (stderr_path == NULL)
677                    stderr_path = slave_name;
678            }
679
680            // Set STDIN to /dev/null if we want STDIO disabled or if either
681            // STDOUT or STDERR have been set to something and STDIN hasn't
682            if (disable_stdio || (stdin_path == NULL && (stdout_path || stderr_path)))
683                stdin_path = "/dev/null";
684
685            // Set STDOUT to /dev/null if we want STDIO disabled or if either
686            // STDIN or STDERR have been set to something and STDOUT hasn't
687            if (disable_stdio || (stdout_path == NULL && (stdin_path || stderr_path)))
688                stdout_path = "/dev/null";
689
690            // Set STDERR to /dev/null if we want STDIO disabled or if either
691            // STDIN or STDOUT have been set to something and STDERR hasn't
692            if (disable_stdio || (stderr_path == NULL && (stdin_path || stdout_path)))
693                stderr_path = "/dev/null";
694
695            if (stdin_path)
696                m_gdb_comm.SetSTDIN (stdin_path);
697            if (stdout_path)
698                m_gdb_comm.SetSTDOUT (stdout_path);
699            if (stderr_path)
700                m_gdb_comm.SetSTDERR (stderr_path);
701
702            m_gdb_comm.SetDisableASLR (launch_flags & eLaunchFlagDisableASLR);
703
704            m_gdb_comm.SendLaunchArchPacket (m_target.GetArchitecture().GetArchitectureName());
705
706            if (working_dir && working_dir[0])
707            {
708                m_gdb_comm.SetWorkingDir (working_dir);
709            }
710
711            // Send the environment and the program + arguments after we connect
712            const Args &environment = launch_info.GetEnvironmentEntries();
713            if (environment.GetArgumentCount())
714            {
715                size_t num_environment_entries = environment.GetArgumentCount();
716                for (size_t i=0; i<num_environment_entries; ++i)
717                {
718                    const char *env_entry = environment.GetArgumentAtIndex(i);
719                    if (env_entry == NULL || m_gdb_comm.SendEnvironmentPacket(env_entry) != 0)
720                        break;
721                }
722            }
723
724            const uint32_t old_packet_timeout = m_gdb_comm.SetPacketTimeout (10);
725            int arg_packet_err = m_gdb_comm.SendArgumentsPacket (launch_info.GetArguments().GetConstArgumentVector());
726            if (arg_packet_err == 0)
727            {
728                std::string error_str;
729                if (m_gdb_comm.GetLaunchSuccess (error_str))
730                {
731                    SetID (m_gdb_comm.GetCurrentProcessID ());
732                }
733                else
734                {
735                    error.SetErrorString (error_str.c_str());
736                }
737            }
738            else
739            {
740                error.SetErrorStringWithFormat("'A' packet returned an error: %i", arg_packet_err);
741            }
742
743            m_gdb_comm.SetPacketTimeout (old_packet_timeout);
744
745            if (GetID() == LLDB_INVALID_PROCESS_ID)
746            {
747                if (log)
748                    log->Printf("failed to connect to debugserver: %s", error.AsCString());
749                KillDebugserverProcess ();
750                return error;
751            }
752
753            if (m_gdb_comm.SendPacketAndWaitForResponse("?", 1, m_last_stop_packet, false))
754            {
755                SetPrivateState (SetThreadStopInfo (m_last_stop_packet));
756
757                if (!disable_stdio)
758                {
759                    if (pty.GetMasterFileDescriptor() != lldb_utility::PseudoTerminal::invalid_fd)
760                        SetSTDIOFileDescriptor (pty.ReleaseMasterFileDescriptor());
761                }
762            }
763        }
764        else
765        {
766            if (log)
767                log->Printf("failed to connect to debugserver: %s", error.AsCString());
768        }
769    }
770    else
771    {
772        // Set our user ID to an invalid process ID.
773        SetID(LLDB_INVALID_PROCESS_ID);
774        error.SetErrorStringWithFormat ("failed to get object file from '%s' for arch %s",
775                                        exe_module->GetFileSpec().GetFilename().AsCString(),
776                                        exe_module->GetArchitecture().GetArchitectureName());
777    }
778    return error;
779
780}
781
782
783Error
784ProcessGDBRemote::ConnectToDebugserver (const char *connect_url)
785{
786    Error error;
787    // Sleep and wait a bit for debugserver to start to listen...
788    std::auto_ptr<ConnectionFileDescriptor> conn_ap(new ConnectionFileDescriptor());
789    if (conn_ap.get())
790    {
791        const uint32_t max_retry_count = 50;
792        uint32_t retry_count = 0;
793        while (!m_gdb_comm.IsConnected())
794        {
795            if (conn_ap->Connect(connect_url, &error) == eConnectionStatusSuccess)
796            {
797                m_gdb_comm.SetConnection (conn_ap.release());
798                break;
799            }
800            retry_count++;
801
802            if (retry_count >= max_retry_count)
803                break;
804
805            usleep (100000);
806        }
807    }
808
809    if (!m_gdb_comm.IsConnected())
810    {
811        if (error.Success())
812            error.SetErrorString("not connected to remote gdb server");
813        return error;
814    }
815
816    // We always seem to be able to open a connection to a local port
817    // so we need to make sure we can then send data to it. If we can't
818    // then we aren't actually connected to anything, so try and do the
819    // handshake with the remote GDB server and make sure that goes
820    // alright.
821    if (!m_gdb_comm.HandshakeWithServer (NULL))
822    {
823        m_gdb_comm.Disconnect();
824        if (error.Success())
825            error.SetErrorString("not connected to remote gdb server");
826        return error;
827    }
828    m_gdb_comm.ResetDiscoverableSettings();
829    m_gdb_comm.QueryNoAckModeSupported ();
830    m_gdb_comm.GetThreadSuffixSupported ();
831    m_gdb_comm.GetListThreadsInStopReplySupported ();
832    m_gdb_comm.GetHostInfo ();
833    m_gdb_comm.GetVContSupported ('c');
834    m_gdb_comm.GetVAttachOrWaitSupported();
835
836    size_t num_cmds = GetExtraStartupCommands().GetArgumentCount();
837    for (size_t idx = 0; idx < num_cmds; idx++)
838    {
839        StringExtractorGDBRemote response;
840        printf ("Sending command: \%s.\n", GetExtraStartupCommands().GetArgumentAtIndex(idx));
841        m_gdb_comm.SendPacketAndWaitForResponse (GetExtraStartupCommands().GetArgumentAtIndex(idx), response, false);
842    }
843    return error;
844}
845
846void
847ProcessGDBRemote::DidLaunchOrAttach ()
848{
849    LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS));
850    if (log)
851        log->Printf ("ProcessGDBRemote::DidLaunch()");
852    if (GetID() != LLDB_INVALID_PROCESS_ID)
853    {
854        m_dispatch_queue_offsets_addr = LLDB_INVALID_ADDRESS;
855
856        BuildDynamicRegisterInfo (false);
857
858        // See if the GDB server supports the qHostInfo information
859
860        const ArchSpec &gdb_remote_arch = m_gdb_comm.GetHostArchitecture();
861        if (gdb_remote_arch.IsValid())
862        {
863            ArchSpec &target_arch = GetTarget().GetArchitecture();
864
865            if (target_arch.IsValid())
866            {
867                // If the remote host is ARM and we have apple as the vendor, then
868                // ARM executables and shared libraries can have mixed ARM architectures.
869                // You can have an armv6 executable, and if the host is armv7, then the
870                // system will load the best possible architecture for all shared libraries
871                // it has, so we really need to take the remote host architecture as our
872                // defacto architecture in this case.
873
874                if (gdb_remote_arch.GetMachine() == llvm::Triple::arm &&
875                    gdb_remote_arch.GetTriple().getVendor() == llvm::Triple::Apple)
876                {
877                    target_arch = gdb_remote_arch;
878                }
879                else
880                {
881                    // Fill in what is missing in the triple
882                    const llvm::Triple &remote_triple = gdb_remote_arch.GetTriple();
883                    llvm::Triple &target_triple = target_arch.GetTriple();
884                    if (target_triple.getVendorName().size() == 0)
885                    {
886                        target_triple.setVendor (remote_triple.getVendor());
887
888                        if (target_triple.getOSName().size() == 0)
889                        {
890                            target_triple.setOS (remote_triple.getOS());
891
892                            if (target_triple.getEnvironmentName().size() == 0)
893                                target_triple.setEnvironment (remote_triple.getEnvironment());
894                        }
895                    }
896                }
897            }
898            else
899            {
900                // The target doesn't have a valid architecture yet, set it from
901                // the architecture we got from the remote GDB server
902                target_arch = gdb_remote_arch;
903            }
904        }
905    }
906}
907
908void
909ProcessGDBRemote::DidLaunch ()
910{
911    DidLaunchOrAttach ();
912}
913
914Error
915ProcessGDBRemote::DoAttachToProcessWithID (lldb::pid_t attach_pid)
916{
917    ProcessAttachInfo attach_info;
918    return DoAttachToProcessWithID(attach_pid, attach_info);
919}
920
921Error
922ProcessGDBRemote::DoAttachToProcessWithID (lldb::pid_t attach_pid, const ProcessAttachInfo &attach_info)
923{
924    Error error;
925    // Clear out and clean up from any current state
926    Clear();
927    if (attach_pid != LLDB_INVALID_PROCESS_ID)
928    {
929        // Make sure we aren't already connected?
930        if (!m_gdb_comm.IsConnected())
931        {
932            char host_port[128];
933            snprintf (host_port, sizeof(host_port), "localhost:%u", get_random_port ());
934            char connect_url[128];
935            snprintf (connect_url, sizeof(connect_url), "connect://%s", host_port);
936
937            error = StartDebugserverProcess (host_port, attach_info);
938
939            if (error.Fail())
940            {
941                const char *error_string = error.AsCString();
942                if (error_string == NULL)
943                    error_string = "unable to launch " DEBUGSERVER_BASENAME;
944
945                SetExitStatus (-1, error_string);
946            }
947            else
948            {
949                error = ConnectToDebugserver (connect_url);
950            }
951        }
952
953        if (error.Success())
954        {
955            char packet[64];
956            const int packet_len = ::snprintf (packet, sizeof(packet), "vAttach;%llx", attach_pid);
957            SetID (attach_pid);
958            m_async_broadcaster.BroadcastEvent (eBroadcastBitAsyncContinue, new EventDataBytes (packet, packet_len));
959        }
960    }
961    return error;
962}
963
964size_t
965ProcessGDBRemote::AttachInputReaderCallback
966(
967    void *baton,
968    InputReader *reader,
969    lldb::InputReaderAction notification,
970    const char *bytes,
971    size_t bytes_len
972)
973{
974    if (notification == eInputReaderGotToken)
975    {
976        ProcessGDBRemote *gdb_process = (ProcessGDBRemote *)baton;
977        if (gdb_process->m_waiting_for_attach)
978            gdb_process->m_waiting_for_attach = false;
979        reader->SetIsDone(true);
980        return 1;
981    }
982    return 0;
983}
984
985Error
986ProcessGDBRemote::DoAttachToProcessWithName (const char *process_name, bool wait_for_launch, const ProcessAttachInfo &attach_info)
987{
988    Error error;
989    // Clear out and clean up from any current state
990    Clear();
991
992    if (process_name && process_name[0])
993    {
994        // Make sure we aren't already connected?
995        if (!m_gdb_comm.IsConnected())
996        {
997            char host_port[128];
998            snprintf (host_port, sizeof(host_port), "localhost:%u", get_random_port ());
999            char connect_url[128];
1000            snprintf (connect_url, sizeof(connect_url), "connect://%s", host_port);
1001
1002            error = StartDebugserverProcess (host_port, attach_info);
1003            if (error.Fail())
1004            {
1005                const char *error_string = error.AsCString();
1006                if (error_string == NULL)
1007                    error_string = "unable to launch " DEBUGSERVER_BASENAME;
1008
1009                SetExitStatus (-1, error_string);
1010            }
1011            else
1012            {
1013                error = ConnectToDebugserver (connect_url);
1014            }
1015        }
1016
1017        if (error.Success())
1018        {
1019            StreamString packet;
1020
1021            if (wait_for_launch)
1022            {
1023                if (!m_gdb_comm.GetVAttachOrWaitSupported())
1024                {
1025                    packet.PutCString ("vAttachWait");
1026                }
1027                else
1028                {
1029                    if (attach_info.GetIgnoreExisting())
1030                        packet.PutCString("vAttachWait");
1031                    else
1032                        packet.PutCString ("vAttachOrWait");
1033                }
1034            }
1035            else
1036                packet.PutCString("vAttachName");
1037            packet.PutChar(';');
1038            packet.PutBytesAsRawHex8(process_name, strlen(process_name), lldb::endian::InlHostByteOrder(), lldb::endian::InlHostByteOrder());
1039
1040            m_async_broadcaster.BroadcastEvent (eBroadcastBitAsyncContinue, new EventDataBytes (packet.GetData(), packet.GetSize()));
1041
1042        }
1043    }
1044    return error;
1045}
1046
1047
1048void
1049ProcessGDBRemote::DidAttach ()
1050{
1051    DidLaunchOrAttach ();
1052}
1053
1054Error
1055ProcessGDBRemote::WillResume ()
1056{
1057    m_continue_c_tids.clear();
1058    m_continue_C_tids.clear();
1059    m_continue_s_tids.clear();
1060    m_continue_S_tids.clear();
1061    return Error();
1062}
1063
1064Error
1065ProcessGDBRemote::DoResume ()
1066{
1067    Error error;
1068    LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS));
1069    if (log)
1070        log->Printf ("ProcessGDBRemote::Resume()");
1071
1072    Listener listener ("gdb-remote.resume-packet-sent");
1073    if (listener.StartListeningForEvents (&m_gdb_comm, GDBRemoteCommunication::eBroadcastBitRunPacketSent))
1074    {
1075        listener.StartListeningForEvents (&m_async_broadcaster, ProcessGDBRemote::eBroadcastBitAsyncThreadDidExit);
1076
1077        StreamString continue_packet;
1078        bool continue_packet_error = false;
1079        if (m_gdb_comm.HasAnyVContSupport ())
1080        {
1081            continue_packet.PutCString ("vCont");
1082
1083            if (!m_continue_c_tids.empty())
1084            {
1085                if (m_gdb_comm.GetVContSupported ('c'))
1086                {
1087                    for (tid_collection::const_iterator t_pos = m_continue_c_tids.begin(), t_end = m_continue_c_tids.end(); t_pos != t_end; ++t_pos)
1088                        continue_packet.Printf(";c:%4.4llx", *t_pos);
1089                }
1090                else
1091                    continue_packet_error = true;
1092            }
1093
1094            if (!continue_packet_error && !m_continue_C_tids.empty())
1095            {
1096                if (m_gdb_comm.GetVContSupported ('C'))
1097                {
1098                    for (tid_sig_collection::const_iterator s_pos = m_continue_C_tids.begin(), s_end = m_continue_C_tids.end(); s_pos != s_end; ++s_pos)
1099                        continue_packet.Printf(";C%2.2x:%4.4llx", s_pos->second, s_pos->first);
1100                }
1101                else
1102                    continue_packet_error = true;
1103            }
1104
1105            if (!continue_packet_error && !m_continue_s_tids.empty())
1106            {
1107                if (m_gdb_comm.GetVContSupported ('s'))
1108                {
1109                    for (tid_collection::const_iterator t_pos = m_continue_s_tids.begin(), t_end = m_continue_s_tids.end(); t_pos != t_end; ++t_pos)
1110                        continue_packet.Printf(";s:%4.4llx", *t_pos);
1111                }
1112                else
1113                    continue_packet_error = true;
1114            }
1115
1116            if (!continue_packet_error && !m_continue_S_tids.empty())
1117            {
1118                if (m_gdb_comm.GetVContSupported ('S'))
1119                {
1120                    for (tid_sig_collection::const_iterator s_pos = m_continue_S_tids.begin(), s_end = m_continue_S_tids.end(); s_pos != s_end; ++s_pos)
1121                        continue_packet.Printf(";S%2.2x:%4.4llx", s_pos->second, s_pos->first);
1122                }
1123                else
1124                    continue_packet_error = true;
1125            }
1126
1127            if (continue_packet_error)
1128                continue_packet.GetString().clear();
1129        }
1130        else
1131            continue_packet_error = true;
1132
1133        if (continue_packet_error)
1134        {
1135            // Either no vCont support, or we tried to use part of the vCont
1136            // packet that wasn't supported by the remote GDB server.
1137            // We need to try and make a simple packet that can do our continue
1138            const size_t num_threads = GetThreadList().GetSize();
1139            const size_t num_continue_c_tids = m_continue_c_tids.size();
1140            const size_t num_continue_C_tids = m_continue_C_tids.size();
1141            const size_t num_continue_s_tids = m_continue_s_tids.size();
1142            const size_t num_continue_S_tids = m_continue_S_tids.size();
1143            if (num_continue_c_tids > 0)
1144            {
1145                if (num_continue_c_tids == num_threads)
1146                {
1147                    // All threads are resuming...
1148                    m_gdb_comm.SetCurrentThreadForRun (-1);
1149                    continue_packet.PutChar ('c');
1150                    continue_packet_error = false;
1151                }
1152                else if (num_continue_c_tids == 1 &&
1153                         num_continue_C_tids == 0 &&
1154                         num_continue_s_tids == 0 &&
1155                         num_continue_S_tids == 0 )
1156                {
1157                    // Only one thread is continuing
1158                    m_gdb_comm.SetCurrentThreadForRun (m_continue_c_tids.front());
1159                    continue_packet.PutChar ('c');
1160                    continue_packet_error = false;
1161                }
1162            }
1163
1164            if (continue_packet_error && num_continue_C_tids > 0)
1165            {
1166                if ((num_continue_C_tids + num_continue_c_tids) == num_threads &&
1167                    num_continue_C_tids > 0 &&
1168                    num_continue_s_tids == 0 &&
1169                    num_continue_S_tids == 0 )
1170                {
1171                    const int continue_signo = m_continue_C_tids.front().second;
1172                    // Only one thread is continuing
1173                    if (num_continue_C_tids > 1)
1174                    {
1175                        // More that one thread with a signal, yet we don't have
1176                        // vCont support and we are being asked to resume each
1177                        // thread with a signal, we need to make sure they are
1178                        // all the same signal, or we can't issue the continue
1179                        // accurately with the current support...
1180                        if (num_continue_C_tids > 1)
1181                        {
1182                            continue_packet_error = false;
1183                            for (size_t i=1; i<m_continue_C_tids.size(); ++i)
1184                            {
1185                                if (m_continue_C_tids[i].second != continue_signo)
1186                                    continue_packet_error = true;
1187                            }
1188                        }
1189                        if (!continue_packet_error)
1190                            m_gdb_comm.SetCurrentThreadForRun (-1);
1191                    }
1192                    else
1193                    {
1194                        // Set the continue thread ID
1195                        continue_packet_error = false;
1196                        m_gdb_comm.SetCurrentThreadForRun (m_continue_C_tids.front().first);
1197                    }
1198                    if (!continue_packet_error)
1199                    {
1200                        // Add threads continuing with the same signo...
1201                        continue_packet.Printf("C%2.2x", continue_signo);
1202                    }
1203                }
1204            }
1205
1206            if (continue_packet_error && num_continue_s_tids > 0)
1207            {
1208                if (num_continue_s_tids == num_threads)
1209                {
1210                    // All threads are resuming...
1211                    m_gdb_comm.SetCurrentThreadForRun (-1);
1212                    continue_packet.PutChar ('s');
1213                    continue_packet_error = false;
1214                }
1215                else if (num_continue_c_tids == 0 &&
1216                         num_continue_C_tids == 0 &&
1217                         num_continue_s_tids == 1 &&
1218                         num_continue_S_tids == 0 )
1219                {
1220                    // Only one thread is stepping
1221                    m_gdb_comm.SetCurrentThreadForRun (m_continue_s_tids.front());
1222                    continue_packet.PutChar ('s');
1223                    continue_packet_error = false;
1224                }
1225            }
1226
1227            if (!continue_packet_error && num_continue_S_tids > 0)
1228            {
1229                if (num_continue_S_tids == num_threads)
1230                {
1231                    const int step_signo = m_continue_S_tids.front().second;
1232                    // Are all threads trying to step with the same signal?
1233                    continue_packet_error = false;
1234                    if (num_continue_S_tids > 1)
1235                    {
1236                        for (size_t i=1; i<num_threads; ++i)
1237                        {
1238                            if (m_continue_S_tids[i].second != step_signo)
1239                                continue_packet_error = true;
1240                        }
1241                    }
1242                    if (!continue_packet_error)
1243                    {
1244                        // Add threads stepping with the same signo...
1245                        m_gdb_comm.SetCurrentThreadForRun (-1);
1246                        continue_packet.Printf("S%2.2x", step_signo);
1247                    }
1248                }
1249                else if (num_continue_c_tids == 0 &&
1250                         num_continue_C_tids == 0 &&
1251                         num_continue_s_tids == 0 &&
1252                         num_continue_S_tids == 1 )
1253                {
1254                    // Only one thread is stepping with signal
1255                    m_gdb_comm.SetCurrentThreadForRun (m_continue_S_tids.front().first);
1256                    continue_packet.Printf("S%2.2x", m_continue_S_tids.front().second);
1257                    continue_packet_error = false;
1258                }
1259            }
1260        }
1261
1262        if (continue_packet_error)
1263        {
1264            error.SetErrorString ("can't make continue packet for this resume");
1265        }
1266        else
1267        {
1268            EventSP event_sp;
1269            TimeValue timeout;
1270            timeout = TimeValue::Now();
1271            timeout.OffsetWithSeconds (5);
1272            if (!IS_VALID_LLDB_HOST_THREAD(m_async_thread))
1273            {
1274                error.SetErrorString ("Trying to resume but the async thread is dead.");
1275                if (log)
1276                    log->Printf ("ProcessGDBRemote::DoResume: Trying to resume but the async thread is dead.");
1277                return error;
1278            }
1279
1280            m_async_broadcaster.BroadcastEvent (eBroadcastBitAsyncContinue, new EventDataBytes (continue_packet.GetData(), continue_packet.GetSize()));
1281
1282            if (listener.WaitForEvent (&timeout, event_sp) == false)
1283            {
1284                error.SetErrorString("Resume timed out.");
1285                if (log)
1286                    log->Printf ("ProcessGDBRemote::DoResume: Resume timed out.");
1287            }
1288            else if (event_sp->BroadcasterIs (&m_async_broadcaster))
1289            {
1290                error.SetErrorString ("Broadcast continue, but the async thread was killed before we got an ack back.");
1291                if (log)
1292                    log->Printf ("ProcessGDBRemote::DoResume: Broadcast continue, but the async thread was killed before we got an ack back.");
1293                return error;
1294            }
1295        }
1296    }
1297
1298    return error;
1299}
1300
1301void
1302ProcessGDBRemote::ClearThreadIDList ()
1303{
1304    Mutex::Locker locker(m_thread_list.GetMutex());
1305    m_thread_ids.clear();
1306}
1307
1308bool
1309ProcessGDBRemote::UpdateThreadIDList ()
1310{
1311    Mutex::Locker locker(m_thread_list.GetMutex());
1312    bool sequence_mutex_unavailable = false;
1313    m_gdb_comm.GetCurrentThreadIDs (m_thread_ids, sequence_mutex_unavailable);
1314    if (sequence_mutex_unavailable)
1315    {
1316        return false; // We just didn't get the list
1317    }
1318    return true;
1319}
1320
1321bool
1322ProcessGDBRemote::UpdateThreadList (ThreadList &old_thread_list, ThreadList &new_thread_list)
1323{
1324    // locker will keep a mutex locked until it goes out of scope
1325    LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_THREAD));
1326    if (log && log->GetMask().Test(GDBR_LOG_VERBOSE))
1327        log->Printf ("ProcessGDBRemote::%s (pid = %llu)", __FUNCTION__, GetID());
1328
1329    size_t num_thread_ids = m_thread_ids.size();
1330    // The "m_thread_ids" thread ID list should always be updated after each stop
1331    // reply packet, but in case it isn't, update it here.
1332    if (num_thread_ids == 0)
1333    {
1334        if (!UpdateThreadIDList ())
1335            return false;
1336        num_thread_ids = m_thread_ids.size();
1337    }
1338
1339    if (num_thread_ids > 0)
1340    {
1341        for (size_t i=0; i<num_thread_ids; ++i)
1342        {
1343            tid_t tid = m_thread_ids[i];
1344            ThreadSP thread_sp (old_thread_list.FindThreadByID (tid, false));
1345            if (!thread_sp)
1346                thread_sp.reset (new ThreadGDBRemote (*this, tid));
1347            new_thread_list.AddThread(thread_sp);
1348        }
1349    }
1350
1351    return true;
1352}
1353
1354
1355StateType
1356ProcessGDBRemote::SetThreadStopInfo (StringExtractor& stop_packet)
1357{
1358    stop_packet.SetFilePos (0);
1359    const char stop_type = stop_packet.GetChar();
1360    switch (stop_type)
1361    {
1362    case 'T':
1363    case 'S':
1364        {
1365            if (GetStopID() == 0)
1366            {
1367                // Our first stop, make sure we have a process ID, and also make
1368                // sure we know about our registers
1369                if (GetID() == LLDB_INVALID_PROCESS_ID)
1370                {
1371                    lldb::pid_t pid = m_gdb_comm.GetCurrentProcessID ();
1372                    if (pid != LLDB_INVALID_PROCESS_ID)
1373                        SetID (pid);
1374                }
1375                BuildDynamicRegisterInfo (true);
1376            }
1377            // Stop with signal and thread info
1378            const uint8_t signo = stop_packet.GetHexU8();
1379            std::string name;
1380            std::string value;
1381            std::string thread_name;
1382            std::string reason;
1383            std::string description;
1384            uint32_t exc_type = 0;
1385            std::vector<addr_t> exc_data;
1386            addr_t thread_dispatch_qaddr = LLDB_INVALID_ADDRESS;
1387            ThreadSP thread_sp;
1388
1389            while (stop_packet.GetNameColonValue(name, value))
1390            {
1391                if (name.compare("metype") == 0)
1392                {
1393                    // exception type in big endian hex
1394                    exc_type = Args::StringToUInt32 (value.c_str(), 0, 16);
1395                }
1396                else if (name.compare("medata") == 0)
1397                {
1398                    // exception data in big endian hex
1399                    exc_data.push_back(Args::StringToUInt64 (value.c_str(), 0, 16));
1400                }
1401                else if (name.compare("thread") == 0)
1402                {
1403                    // thread in big endian hex
1404                    lldb::tid_t tid = Args::StringToUInt64 (value.c_str(), LLDB_INVALID_THREAD_ID, 16);
1405                    // m_thread_list does have its own mutex, but we need to
1406                    // hold onto the mutex between the call to m_thread_list.FindThreadByID(...)
1407                    // and the m_thread_list.AddThread(...) so it doesn't change on us
1408                    Mutex::Locker locker (m_thread_list.GetMutex ());
1409                    thread_sp = m_thread_list.FindThreadByID(tid, false);
1410                    if (!thread_sp)
1411                    {
1412                        // Create the thread if we need to
1413                        thread_sp.reset (new ThreadGDBRemote (*this, tid));
1414                        m_thread_list.AddThread(thread_sp);
1415                    }
1416                }
1417                else if (name.compare("threads") == 0)
1418                {
1419                    Mutex::Locker locker(m_thread_list.GetMutex());
1420                    m_thread_ids.clear();
1421                    // A comma separated list of all threads in the current
1422                    // process that includes the thread for this stop reply
1423                    // packet
1424                    size_t comma_pos;
1425                    lldb::tid_t tid;
1426                    while ((comma_pos = value.find(',')) != std::string::npos)
1427                    {
1428                        value[comma_pos] = '\0';
1429                        // thread in big endian hex
1430                        tid = Args::StringToUInt64 (value.c_str(), LLDB_INVALID_THREAD_ID, 16);
1431                        if (tid != LLDB_INVALID_THREAD_ID)
1432                            m_thread_ids.push_back (tid);
1433                        value.erase(0, comma_pos + 1);
1434
1435                    }
1436                    tid = Args::StringToUInt64 (value.c_str(), LLDB_INVALID_THREAD_ID, 16);
1437                    if (tid != LLDB_INVALID_THREAD_ID)
1438                        m_thread_ids.push_back (tid);
1439                }
1440                else if (name.compare("hexname") == 0)
1441                {
1442                    StringExtractor name_extractor;
1443                    // Swap "value" over into "name_extractor"
1444                    name_extractor.GetStringRef().swap(value);
1445                    // Now convert the HEX bytes into a string value
1446                    name_extractor.GetHexByteString (value);
1447                    thread_name.swap (value);
1448                }
1449                else if (name.compare("name") == 0)
1450                {
1451                    thread_name.swap (value);
1452                }
1453                else if (name.compare("qaddr") == 0)
1454                {
1455                    thread_dispatch_qaddr = Args::StringToUInt64 (value.c_str(), 0, 16);
1456                }
1457                else if (name.compare("reason") == 0)
1458                {
1459                    reason.swap(value);
1460                }
1461                else if (name.compare("description") == 0)
1462                {
1463                    StringExtractor desc_extractor;
1464                    // Swap "value" over into "name_extractor"
1465                    desc_extractor.GetStringRef().swap(value);
1466                    // Now convert the HEX bytes into a string value
1467                    desc_extractor.GetHexByteString (thread_name);
1468                }
1469                else if (name.size() == 2 && ::isxdigit(name[0]) && ::isxdigit(name[1]))
1470                {
1471                    // We have a register number that contains an expedited
1472                    // register value. Lets supply this register to our thread
1473                    // so it won't have to go and read it.
1474                    if (thread_sp)
1475                    {
1476                        uint32_t reg = Args::StringToUInt32 (name.c_str(), UINT32_MAX, 16);
1477
1478                        if (reg != UINT32_MAX)
1479                        {
1480                            StringExtractor reg_value_extractor;
1481                            // Swap "value" over into "reg_value_extractor"
1482                            reg_value_extractor.GetStringRef().swap(value);
1483                            if (!static_cast<ThreadGDBRemote *> (thread_sp.get())->PrivateSetRegisterValue (reg, reg_value_extractor))
1484                            {
1485                                Host::SetCrashDescriptionWithFormat("Setting thread register '%s' (decoded to %u (0x%x)) with value '%s' for stop packet: '%s'",
1486                                                                    name.c_str(),
1487                                                                    reg,
1488                                                                    reg,
1489                                                                    reg_value_extractor.GetStringRef().c_str(),
1490                                                                    stop_packet.GetStringRef().c_str());
1491                            }
1492                        }
1493                    }
1494                }
1495            }
1496
1497            if (thread_sp)
1498            {
1499                ThreadGDBRemote *gdb_thread = static_cast<ThreadGDBRemote *> (thread_sp.get());
1500
1501                gdb_thread->SetThreadDispatchQAddr (thread_dispatch_qaddr);
1502                gdb_thread->SetName (thread_name.empty() ? NULL : thread_name.c_str());
1503                if (exc_type != 0)
1504                {
1505                    const size_t exc_data_size = exc_data.size();
1506
1507                    gdb_thread->SetStopInfo (StopInfoMachException::CreateStopReasonWithMachException (*thread_sp,
1508                                                                                                       exc_type,
1509                                                                                                       exc_data_size,
1510                                                                                                       exc_data_size >= 1 ? exc_data[0] : 0,
1511                                                                                                       exc_data_size >= 2 ? exc_data[1] : 0,
1512                                                                                                       exc_data_size >= 3 ? exc_data[2] : 0));
1513                }
1514                else
1515                {
1516                    bool handled = false;
1517                    if (!reason.empty())
1518                    {
1519                        if (reason.compare("trace") == 0)
1520                        {
1521                            gdb_thread->SetStopInfo (StopInfo::CreateStopReasonToTrace (*thread_sp));
1522                            handled = true;
1523                        }
1524                        else if (reason.compare("breakpoint") == 0)
1525                        {
1526                            addr_t pc = gdb_thread->GetRegisterContext()->GetPC();
1527                            lldb::BreakpointSiteSP bp_site_sp = gdb_thread->GetProcess()->GetBreakpointSiteList().FindByAddress(pc);
1528                            if (bp_site_sp)
1529                            {
1530                                // If the breakpoint is for this thread, then we'll report the hit, but if it is for another thread,
1531                                // we can just report no reason.  We don't need to worry about stepping over the breakpoint here, that
1532                                // will be taken care of when the thread resumes and notices that there's a breakpoint under the pc.
1533                                handled = true;
1534                                if (bp_site_sp->ValidForThisThread (gdb_thread))
1535                                {
1536                                    gdb_thread->SetStopInfo (StopInfo::CreateStopReasonWithBreakpointSiteID (*thread_sp, bp_site_sp->GetID()));
1537                                }
1538                                else
1539                                {
1540                                    StopInfoSP invalid_stop_info_sp;
1541                                    gdb_thread->SetStopInfo (invalid_stop_info_sp);
1542                                }
1543                            }
1544
1545                        }
1546                        else if (reason.compare("trap") == 0)
1547                        {
1548                            // Let the trap just use the standard signal stop reason below...
1549                        }
1550                        else if (reason.compare("watchpoint") == 0)
1551                        {
1552                            break_id_t watch_id = LLDB_INVALID_WATCH_ID;
1553                            // TODO: locate the watchpoint somehow...
1554                            gdb_thread->SetStopInfo (StopInfo::CreateStopReasonWithWatchpointID (*thread_sp, watch_id));
1555                            handled = true;
1556                        }
1557                        else if (reason.compare("exception") == 0)
1558                        {
1559                            gdb_thread->SetStopInfo (StopInfo::CreateStopReasonWithException(*thread_sp, description.c_str()));
1560                            handled = true;
1561                        }
1562                    }
1563
1564                    if (signo)
1565                    {
1566                        if (signo == SIGTRAP)
1567                        {
1568                            // Currently we are going to assume SIGTRAP means we are either
1569                            // hitting a breakpoint or hardware single stepping.
1570                            handled = true;
1571                            addr_t pc = gdb_thread->GetRegisterContext()->GetPC();
1572                            lldb::BreakpointSiteSP bp_site_sp = gdb_thread->GetProcess()->GetBreakpointSiteList().FindByAddress(pc);
1573
1574                            if (bp_site_sp)
1575                            {
1576                                // If the breakpoint is for this thread, then we'll report the hit, but if it is for another thread,
1577                                // we can just report no reason.  We don't need to worry about stepping over the breakpoint here, that
1578                                // will be taken care of when the thread resumes and notices that there's a breakpoint under the pc.
1579                                if (bp_site_sp->ValidForThisThread (gdb_thread))
1580                                {
1581                                    gdb_thread->SetStopInfo (StopInfo::CreateStopReasonWithBreakpointSiteID (*thread_sp, bp_site_sp->GetID()));
1582                                }
1583                                else
1584                                {
1585                                    StopInfoSP invalid_stop_info_sp;
1586                                    gdb_thread->SetStopInfo (invalid_stop_info_sp);
1587                                }
1588                            }
1589                            else
1590                            {
1591                                // If we were stepping then assume the stop was the result of the trace.  If we were
1592                                // not stepping then report the SIGTRAP.
1593                                // FIXME: We are still missing the case where we single step over a trap instruction.
1594                                if (gdb_thread->GetTemporaryResumeState() == eStateStepping)
1595                                    gdb_thread->SetStopInfo (StopInfo::CreateStopReasonToTrace (*thread_sp));
1596                                else
1597                                    gdb_thread->SetStopInfo (StopInfo::CreateStopReasonWithSignal(*thread_sp, signo));
1598                            }
1599                        }
1600                        if (!handled)
1601                            gdb_thread->SetStopInfo (StopInfo::CreateStopReasonWithSignal (*thread_sp, signo));
1602                }
1603                else
1604                {
1605                    StopInfoSP invalid_stop_info_sp;
1606                    gdb_thread->SetStopInfo (invalid_stop_info_sp);
1607                }
1608
1609                    if (!description.empty())
1610                    {
1611                        lldb::StopInfoSP stop_info_sp (gdb_thread->GetStopInfo ());
1612                        if (stop_info_sp)
1613                        {
1614                            stop_info_sp->SetDescription (description.c_str());
1615                        }
1616                        else
1617                        {
1618                            gdb_thread->SetStopInfo (StopInfo::CreateStopReasonWithException (*thread_sp, description.c_str()));
1619                        }
1620                    }
1621                }
1622            }
1623            return eStateStopped;
1624        }
1625        break;
1626
1627    case 'W':
1628        // process exited
1629        return eStateExited;
1630
1631    default:
1632        break;
1633    }
1634    return eStateInvalid;
1635}
1636
1637void
1638ProcessGDBRemote::RefreshStateAfterStop ()
1639{
1640    Mutex::Locker locker(m_thread_list.GetMutex());
1641    m_thread_ids.clear();
1642    // Set the thread stop info. It might have a "threads" key whose value is
1643    // a list of all thread IDs in the current process, so m_thread_ids might
1644    // get set.
1645    SetThreadStopInfo (m_last_stop_packet);
1646    // Check to see if SetThreadStopInfo() filled in m_thread_ids?
1647    if (m_thread_ids.empty())
1648    {
1649        // No, we need to fetch the thread list manually
1650        UpdateThreadIDList();
1651    }
1652
1653    // Let all threads recover from stopping and do any clean up based
1654    // on the previous thread state (if any).
1655    m_thread_list.RefreshStateAfterStop();
1656
1657}
1658
1659Error
1660ProcessGDBRemote::DoHalt (bool &caused_stop)
1661{
1662    Error error;
1663
1664    bool timed_out = false;
1665    Mutex::Locker locker;
1666
1667    if (m_public_state.GetValue() == eStateAttaching)
1668    {
1669        // We are being asked to halt during an attach. We need to just close
1670        // our file handle and debugserver will go away, and we can be done...
1671        m_gdb_comm.Disconnect();
1672    }
1673    else
1674    {
1675        if (!m_gdb_comm.SendInterrupt (locker, 2, timed_out))
1676        {
1677            if (timed_out)
1678                error.SetErrorString("timed out sending interrupt packet");
1679            else
1680                error.SetErrorString("unknown error sending interrupt packet");
1681        }
1682
1683        caused_stop = m_gdb_comm.GetInterruptWasSent ();
1684    }
1685    return error;
1686}
1687
1688Error
1689ProcessGDBRemote::InterruptIfRunning
1690(
1691    bool discard_thread_plans,
1692    bool catch_stop_event,
1693    EventSP &stop_event_sp
1694)
1695{
1696    Error error;
1697
1698    LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_PROCESS));
1699
1700    bool paused_private_state_thread = false;
1701    const bool is_running = m_gdb_comm.IsRunning();
1702    if (log)
1703        log->Printf ("ProcessGDBRemote::InterruptIfRunning(discard_thread_plans=%i, catch_stop_event=%i) is_running=%i",
1704                     discard_thread_plans,
1705                     catch_stop_event,
1706                     is_running);
1707
1708    if (discard_thread_plans)
1709    {
1710        if (log)
1711            log->Printf ("ProcessGDBRemote::InterruptIfRunning() discarding all thread plans");
1712        m_thread_list.DiscardThreadPlans();
1713    }
1714    if (is_running)
1715    {
1716        if (catch_stop_event)
1717        {
1718            if (log)
1719                log->Printf ("ProcessGDBRemote::InterruptIfRunning() pausing private state thread");
1720            PausePrivateStateThread();
1721            paused_private_state_thread = true;
1722        }
1723
1724        bool timed_out = false;
1725        Mutex::Locker locker;
1726
1727        if (!m_gdb_comm.SendInterrupt (locker, 1, timed_out))
1728        {
1729            if (timed_out)
1730                error.SetErrorString("timed out sending interrupt packet");
1731            else
1732                error.SetErrorString("unknown error sending interrupt packet");
1733            if (paused_private_state_thread)
1734                ResumePrivateStateThread();
1735            return error;
1736        }
1737
1738        if (catch_stop_event)
1739        {
1740            // LISTEN HERE
1741            TimeValue timeout_time;
1742            timeout_time = TimeValue::Now();
1743            timeout_time.OffsetWithSeconds(5);
1744            StateType state = WaitForStateChangedEventsPrivate (&timeout_time, stop_event_sp);
1745
1746            timed_out = state == eStateInvalid;
1747            if (log)
1748                log->Printf ("ProcessGDBRemote::InterruptIfRunning() catch stop event: state = %s, timed-out=%i", StateAsCString(state), timed_out);
1749
1750            if (timed_out)
1751                error.SetErrorString("unable to verify target stopped");
1752        }
1753
1754        if (paused_private_state_thread)
1755        {
1756            if (log)
1757                log->Printf ("ProcessGDBRemote::InterruptIfRunning() resuming private state thread");
1758            ResumePrivateStateThread();
1759        }
1760    }
1761    return error;
1762}
1763
1764Error
1765ProcessGDBRemote::WillDetach ()
1766{
1767    LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_PROCESS));
1768    if (log)
1769        log->Printf ("ProcessGDBRemote::WillDetach()");
1770
1771    bool discard_thread_plans = true;
1772    bool catch_stop_event = true;
1773    EventSP event_sp;
1774
1775    // FIXME: InterruptIfRunning should be done in the Process base class, or better still make Halt do what is
1776    // needed.  This shouldn't be a feature of a particular plugin.
1777
1778    return InterruptIfRunning (discard_thread_plans, catch_stop_event, event_sp);
1779}
1780
1781Error
1782ProcessGDBRemote::DoDetach()
1783{
1784    Error error;
1785    LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_PROCESS));
1786    if (log)
1787        log->Printf ("ProcessGDBRemote::DoDetach()");
1788
1789    DisableAllBreakpointSites ();
1790
1791    m_thread_list.DiscardThreadPlans();
1792
1793    bool success = m_gdb_comm.Detach ();
1794    if (log)
1795    {
1796        if (success)
1797            log->PutCString ("ProcessGDBRemote::DoDetach() detach packet sent successfully");
1798        else
1799            log->PutCString ("ProcessGDBRemote::DoDetach() detach packet send failed");
1800    }
1801    // Sleep for one second to let the process get all detached...
1802    StopAsyncThread ();
1803
1804    SetPrivateState (eStateDetached);
1805    ResumePrivateStateThread();
1806
1807    //KillDebugserverProcess ();
1808    return error;
1809}
1810
1811
1812Error
1813ProcessGDBRemote::DoDestroy ()
1814{
1815    Error error;
1816    LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_PROCESS));
1817    if (log)
1818        log->Printf ("ProcessGDBRemote::DoDestroy()");
1819
1820    // There is a bug in older iOS debugservers where they don't shut down the process
1821    // they are debugging properly.  If the process is sitting at a breakpoint or an exception,
1822    // this can cause problems with restarting.  So we check to see if any of our threads are stopped
1823    // at a breakpoint, and if so we remove all the breakpoints, resume the process, and THEN
1824    // destroy it again.
1825    //
1826    // Note, we don't have a good way to test the version of debugserver, but I happen to know that
1827    // the set of all the iOS debugservers which don't support GetThreadSuffixSupported() and that of
1828    // the debugservers with this bug are equal.  There really should be a better way to test this!
1829    //
1830    // We also use m_destroy_tried_resuming to make sure we only do this once, if we resume and then halt and
1831    // get called here to destroy again and we're still at a breakpoint or exception, then we should
1832    // just do the straight-forward kill.
1833    //
1834    // And of course, if we weren't able to stop the process by the time we get here, it isn't
1835    // necessary (or helpful) to do any of this.
1836
1837    if (!m_gdb_comm.GetThreadSuffixSupported() && m_public_state.GetValue() != eStateRunning)
1838    {
1839        PlatformSP platform_sp = GetTarget().GetPlatform();
1840
1841        // FIXME: These should be ConstStrings so we aren't doing strcmp'ing.
1842        if (platform_sp
1843            && platform_sp->GetName()
1844            && strcmp (platform_sp->GetName(), PlatformRemoteiOS::GetShortPluginNameStatic()) == 0)
1845        {
1846            if (m_destroy_tried_resuming)
1847            {
1848                if (log)
1849                    log->PutCString ("ProcessGDBRemote::DoDestroy()Tried resuming to destroy once already, not doing it again.");
1850            }
1851            else
1852            {
1853                // At present, the plans are discarded and the breakpoints disabled Process::Destroy,
1854                // but we really need it to happen here and it doesn't matter if we do it twice.
1855                m_thread_list.DiscardThreadPlans();
1856                DisableAllBreakpointSites();
1857
1858                bool stop_looks_like_crash = false;
1859                ThreadList &threads = GetThreadList();
1860
1861                {
1862                    Mutex::Locker locker(threads.GetMutex());
1863
1864                    size_t num_threads = threads.GetSize();
1865                    for (size_t i = 0; i < num_threads; i++)
1866                    {
1867                        ThreadSP thread_sp = threads.GetThreadAtIndex(i);
1868                        StopInfoSP stop_info_sp = thread_sp->GetPrivateStopReason();
1869                        StopReason reason = eStopReasonInvalid;
1870                        if (stop_info_sp)
1871                            reason = stop_info_sp->GetStopReason();
1872                        if (reason == eStopReasonBreakpoint
1873                            || reason == eStopReasonException)
1874                        {
1875                            if (log)
1876                                log->Printf ("ProcessGDBRemote::DoDestroy() - thread: %lld stopped with reason: %s.",
1877                                             thread_sp->GetID(),
1878                                             stop_info_sp->GetDescription());
1879                            stop_looks_like_crash = true;
1880                            break;
1881                        }
1882                    }
1883                }
1884
1885                if (stop_looks_like_crash)
1886                {
1887                    if (log)
1888                        log->PutCString ("ProcessGDBRemote::DoDestroy() - Stopped at a breakpoint, continue and then kill.");
1889                    m_destroy_tried_resuming = true;
1890
1891                    // If we are going to run again before killing, it would be good to suspend all the threads
1892                    // before resuming so they won't get into more trouble.  Sadly, for the threads stopped with
1893                    // the breakpoint or exception, the exception doesn't get cleared if it is suspended, so we do
1894                    // have to run the risk of letting those threads proceed a bit.
1895
1896                    {
1897                        Mutex::Locker locker(threads.GetMutex());
1898
1899                        size_t num_threads = threads.GetSize();
1900                        for (size_t i = 0; i < num_threads; i++)
1901                        {
1902                            ThreadSP thread_sp = threads.GetThreadAtIndex(i);
1903                            StopInfoSP stop_info_sp = thread_sp->GetPrivateStopReason();
1904                            StopReason reason = eStopReasonInvalid;
1905                            if (stop_info_sp)
1906                                reason = stop_info_sp->GetStopReason();
1907                            if (reason != eStopReasonBreakpoint
1908                                && reason != eStopReasonException)
1909                            {
1910                                if (log)
1911                                    log->Printf ("ProcessGDBRemote::DoDestroy() - Suspending thread: %lld before running.",
1912                                                 thread_sp->GetID());
1913                                thread_sp->SetResumeState(eStateSuspended);
1914                            }
1915                        }
1916                    }
1917                    Resume ();
1918                    return Destroy();
1919                }
1920            }
1921        }
1922    }
1923
1924    // Interrupt if our inferior is running...
1925    int exit_status = SIGABRT;
1926    std::string exit_string;
1927
1928    if (m_gdb_comm.IsConnected())
1929    {
1930        if (m_public_state.GetValue() != eStateAttaching)
1931        {
1932
1933            StringExtractorGDBRemote response;
1934            bool send_async = true;
1935            const uint32_t old_packet_timeout = m_gdb_comm.SetPacketTimeout (3);
1936
1937            if (m_gdb_comm.SendPacketAndWaitForResponse("k", 1, response, send_async))
1938            {
1939                char packet_cmd = response.GetChar(0);
1940
1941                if (packet_cmd == 'W' || packet_cmd == 'X')
1942                {
1943                    SetLastStopPacket (response);
1944                    ClearThreadIDList ();
1945                    exit_status = response.GetHexU8();
1946                }
1947                else
1948                {
1949                    if (log)
1950                        log->Printf ("ProcessGDBRemote::DoDestroy - got unexpected response to k packet: %s", response.GetStringRef().c_str());
1951                    exit_string.assign("got unexpected response to k packet: ");
1952                    exit_string.append(response.GetStringRef());
1953                }
1954            }
1955            else
1956            {
1957                if (log)
1958                    log->Printf ("ProcessGDBRemote::DoDestroy - failed to send k packet");
1959                exit_string.assign("failed to send the k packet");
1960            }
1961
1962            m_gdb_comm.SetPacketTimeout(old_packet_timeout);
1963        }
1964        else
1965        {
1966            if (log)
1967                log->Printf ("ProcessGDBRemote::DoDestroy - failed to send k packet");
1968            exit_string.assign ("killed or interrupted while attaching.");
1969        }
1970    }
1971    else
1972    {
1973        // If we missed setting the exit status on the way out, do it here.
1974        // NB set exit status can be called multiple times, the first one sets the status.
1975        exit_string.assign("destroying when not connected to debugserver");
1976    }
1977
1978    SetExitStatus(exit_status, exit_string.c_str());
1979
1980    StopAsyncThread ();
1981    KillDebugserverProcess ();
1982    return error;
1983}
1984
1985//------------------------------------------------------------------
1986// Process Queries
1987//------------------------------------------------------------------
1988
1989bool
1990ProcessGDBRemote::IsAlive ()
1991{
1992    return m_gdb_comm.IsConnected() && m_private_state.GetValue() != eStateExited;
1993}
1994
1995// For kernel debugging, we return the load address of the kernel binary as the
1996// ImageInfoAddress and we return the DynamicLoaderDarwinKernel as the GetDynamicLoader()
1997// name so the correct DynamicLoader plugin is chosen.
1998addr_t
1999ProcessGDBRemote::GetImageInfoAddress()
2000{
2001    if (m_kernel_load_addr != LLDB_INVALID_ADDRESS)
2002        return m_kernel_load_addr;
2003    else
2004        return m_gdb_comm.GetShlibInfoAddr();
2005}
2006
2007//------------------------------------------------------------------
2008// Process Memory
2009//------------------------------------------------------------------
2010size_t
2011ProcessGDBRemote::DoReadMemory (addr_t addr, void *buf, size_t size, Error &error)
2012{
2013    if (size > m_max_memory_size)
2014    {
2015        // Keep memory read sizes down to a sane limit. This function will be
2016        // called multiple times in order to complete the task by
2017        // lldb_private::Process so it is ok to do this.
2018        size = m_max_memory_size;
2019    }
2020
2021    char packet[64];
2022    const int packet_len = ::snprintf (packet, sizeof(packet), "m%llx,%llx", (uint64_t)addr, (uint64_t)size);
2023    assert (packet_len + 1 < sizeof(packet));
2024    StringExtractorGDBRemote response;
2025    if (m_gdb_comm.SendPacketAndWaitForResponse(packet, packet_len, response, true))
2026    {
2027        if (response.IsNormalResponse())
2028        {
2029            error.Clear();
2030            return response.GetHexBytes(buf, size, '\xdd');
2031        }
2032        else if (response.IsErrorResponse())
2033            error.SetErrorString("memory read failed");
2034        else if (response.IsUnsupportedResponse())
2035            error.SetErrorStringWithFormat("GDB server does not support reading memory");
2036        else
2037            error.SetErrorStringWithFormat("unexpected response to GDB server memory read packet '%s': '%s'", packet, response.GetStringRef().c_str());
2038    }
2039    else
2040    {
2041        error.SetErrorStringWithFormat("failed to sent packet: '%s'", packet);
2042    }
2043    return 0;
2044}
2045
2046size_t
2047ProcessGDBRemote::DoWriteMemory (addr_t addr, const void *buf, size_t size, Error &error)
2048{
2049    if (size > m_max_memory_size)
2050    {
2051        // Keep memory read sizes down to a sane limit. This function will be
2052        // called multiple times in order to complete the task by
2053        // lldb_private::Process so it is ok to do this.
2054        size = m_max_memory_size;
2055    }
2056
2057    StreamString packet;
2058    packet.Printf("M%llx,%llx:", addr, (uint64_t)size);
2059    packet.PutBytesAsRawHex8(buf, size, lldb::endian::InlHostByteOrder(), lldb::endian::InlHostByteOrder());
2060    StringExtractorGDBRemote response;
2061    if (m_gdb_comm.SendPacketAndWaitForResponse(packet.GetData(), packet.GetSize(), response, true))
2062    {
2063        if (response.IsOKResponse())
2064        {
2065            error.Clear();
2066            return size;
2067        }
2068        else if (response.IsErrorResponse())
2069            error.SetErrorString("memory write failed");
2070        else if (response.IsUnsupportedResponse())
2071            error.SetErrorStringWithFormat("GDB server does not support writing memory");
2072        else
2073            error.SetErrorStringWithFormat("unexpected response to GDB server memory write packet '%s': '%s'", packet.GetString().c_str(), response.GetStringRef().c_str());
2074    }
2075    else
2076    {
2077        error.SetErrorStringWithFormat("failed to sent packet: '%s'", packet.GetString().c_str());
2078    }
2079    return 0;
2080}
2081
2082lldb::addr_t
2083ProcessGDBRemote::DoAllocateMemory (size_t size, uint32_t permissions, Error &error)
2084{
2085    addr_t allocated_addr = LLDB_INVALID_ADDRESS;
2086
2087    LazyBool supported = m_gdb_comm.SupportsAllocDeallocMemory();
2088    switch (supported)
2089    {
2090        case eLazyBoolCalculate:
2091        case eLazyBoolYes:
2092            allocated_addr = m_gdb_comm.AllocateMemory (size, permissions);
2093            if (allocated_addr != LLDB_INVALID_ADDRESS || supported == eLazyBoolYes)
2094                return allocated_addr;
2095
2096        case eLazyBoolNo:
2097            // Call mmap() to create memory in the inferior..
2098            unsigned prot = 0;
2099            if (permissions & lldb::ePermissionsReadable)
2100                prot |= eMmapProtRead;
2101            if (permissions & lldb::ePermissionsWritable)
2102                prot |= eMmapProtWrite;
2103            if (permissions & lldb::ePermissionsExecutable)
2104                prot |= eMmapProtExec;
2105
2106            if (InferiorCallMmap(this, allocated_addr, 0, size, prot,
2107                                 eMmapFlagsAnon | eMmapFlagsPrivate, -1, 0))
2108                m_addr_to_mmap_size[allocated_addr] = size;
2109            else
2110                allocated_addr = LLDB_INVALID_ADDRESS;
2111            break;
2112    }
2113
2114    if (allocated_addr == LLDB_INVALID_ADDRESS)
2115        error.SetErrorStringWithFormat("unable to allocate %llu bytes of memory with permissions %s", (uint64_t)size, GetPermissionsAsCString (permissions));
2116    else
2117        error.Clear();
2118    return allocated_addr;
2119}
2120
2121Error
2122ProcessGDBRemote::GetMemoryRegionInfo (addr_t load_addr,
2123                                       MemoryRegionInfo &region_info)
2124{
2125
2126    Error error (m_gdb_comm.GetMemoryRegionInfo (load_addr, region_info));
2127    return error;
2128}
2129
2130Error
2131ProcessGDBRemote::GetWatchpointSupportInfo (uint32_t &num)
2132{
2133
2134    Error error (m_gdb_comm.GetWatchpointSupportInfo (num));
2135    return error;
2136}
2137
2138Error
2139ProcessGDBRemote::GetWatchpointSupportInfo (uint32_t &num, bool& after)
2140{
2141    Error error (m_gdb_comm.GetWatchpointSupportInfo (num, after));
2142    return error;
2143}
2144
2145Error
2146ProcessGDBRemote::DoDeallocateMemory (lldb::addr_t addr)
2147{
2148    Error error;
2149    LazyBool supported = m_gdb_comm.SupportsAllocDeallocMemory();
2150
2151    switch (supported)
2152    {
2153        case eLazyBoolCalculate:
2154            // We should never be deallocating memory without allocating memory
2155            // first so we should never get eLazyBoolCalculate
2156            error.SetErrorString ("tried to deallocate memory without ever allocating memory");
2157            break;
2158
2159        case eLazyBoolYes:
2160            if (!m_gdb_comm.DeallocateMemory (addr))
2161                error.SetErrorStringWithFormat("unable to deallocate memory at 0x%llx", addr);
2162            break;
2163
2164        case eLazyBoolNo:
2165            // Call munmap() to deallocate memory in the inferior..
2166            {
2167                MMapMap::iterator pos = m_addr_to_mmap_size.find(addr);
2168                if (pos != m_addr_to_mmap_size.end() &&
2169                    InferiorCallMunmap(this, addr, pos->second))
2170                    m_addr_to_mmap_size.erase (pos);
2171                else
2172                    error.SetErrorStringWithFormat("unable to deallocate memory at 0x%llx", addr);
2173            }
2174            break;
2175    }
2176
2177    return error;
2178}
2179
2180
2181//------------------------------------------------------------------
2182// Process STDIO
2183//------------------------------------------------------------------
2184size_t
2185ProcessGDBRemote::PutSTDIN (const char *src, size_t src_len, Error &error)
2186{
2187    if (m_stdio_communication.IsConnected())
2188    {
2189        ConnectionStatus status;
2190        m_stdio_communication.Write(src, src_len, status, NULL);
2191    }
2192    return 0;
2193}
2194
2195Error
2196ProcessGDBRemote::EnableBreakpoint (BreakpointSite *bp_site)
2197{
2198    Error error;
2199    assert (bp_site != NULL);
2200
2201    LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_BREAKPOINTS));
2202    user_id_t site_id = bp_site->GetID();
2203    const addr_t addr = bp_site->GetLoadAddress();
2204    if (log)
2205        log->Printf ("ProcessGDBRemote::EnableBreakpoint (size_id = %llu) address = 0x%llx", site_id, (uint64_t)addr);
2206
2207    if (bp_site->IsEnabled())
2208    {
2209        if (log)
2210            log->Printf ("ProcessGDBRemote::EnableBreakpoint (size_id = %llu) address = 0x%llx -- SUCCESS (already enabled)", site_id, (uint64_t)addr);
2211        return error;
2212    }
2213    else
2214    {
2215        const size_t bp_op_size = GetSoftwareBreakpointTrapOpcode (bp_site);
2216
2217        if (bp_site->HardwarePreferred())
2218        {
2219            // Try and set hardware breakpoint, and if that fails, fall through
2220            // and set a software breakpoint?
2221            if (m_gdb_comm.SupportsGDBStoppointPacket (eBreakpointHardware))
2222            {
2223                if (m_gdb_comm.SendGDBStoppointTypePacket(eBreakpointHardware, true, addr, bp_op_size) == 0)
2224                {
2225                    bp_site->SetEnabled(true);
2226                    bp_site->SetType (BreakpointSite::eHardware);
2227                    return error;
2228                }
2229            }
2230        }
2231
2232        if (m_gdb_comm.SupportsGDBStoppointPacket (eBreakpointSoftware))
2233        {
2234            if (m_gdb_comm.SendGDBStoppointTypePacket(eBreakpointSoftware, true, addr, bp_op_size) == 0)
2235            {
2236                bp_site->SetEnabled(true);
2237                bp_site->SetType (BreakpointSite::eExternal);
2238                return error;
2239            }
2240        }
2241
2242        return EnableSoftwareBreakpoint (bp_site);
2243    }
2244
2245    if (log)
2246    {
2247        const char *err_string = error.AsCString();
2248        log->Printf ("ProcessGDBRemote::EnableBreakpoint() error for breakpoint at 0x%8.8llx: %s",
2249                     bp_site->GetLoadAddress(),
2250                     err_string ? err_string : "NULL");
2251    }
2252    // We shouldn't reach here on a successful breakpoint enable...
2253    if (error.Success())
2254        error.SetErrorToGenericError();
2255    return error;
2256}
2257
2258Error
2259ProcessGDBRemote::DisableBreakpoint (BreakpointSite *bp_site)
2260{
2261    Error error;
2262    assert (bp_site != NULL);
2263    addr_t addr = bp_site->GetLoadAddress();
2264    user_id_t site_id = bp_site->GetID();
2265    LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_BREAKPOINTS));
2266    if (log)
2267        log->Printf ("ProcessGDBRemote::DisableBreakpoint (site_id = %llu) addr = 0x%8.8llx", site_id, (uint64_t)addr);
2268
2269    if (bp_site->IsEnabled())
2270    {
2271        const size_t bp_op_size = GetSoftwareBreakpointTrapOpcode (bp_site);
2272
2273        BreakpointSite::Type bp_type = bp_site->GetType();
2274        switch (bp_type)
2275        {
2276        case BreakpointSite::eSoftware:
2277            error = DisableSoftwareBreakpoint (bp_site);
2278            break;
2279
2280        case BreakpointSite::eHardware:
2281            if (m_gdb_comm.SendGDBStoppointTypePacket(eBreakpointSoftware, false, addr, bp_op_size))
2282                error.SetErrorToGenericError();
2283            break;
2284
2285        case BreakpointSite::eExternal:
2286            if (m_gdb_comm.SendGDBStoppointTypePacket(eBreakpointSoftware, false, addr, bp_op_size))
2287                error.SetErrorToGenericError();
2288            break;
2289        }
2290        if (error.Success())
2291            bp_site->SetEnabled(false);
2292    }
2293    else
2294    {
2295        if (log)
2296            log->Printf ("ProcessGDBRemote::DisableBreakpoint (site_id = %llu) addr = 0x%8.8llx -- SUCCESS (already disabled)", site_id, (uint64_t)addr);
2297        return error;
2298    }
2299
2300    if (error.Success())
2301        error.SetErrorToGenericError();
2302    return error;
2303}
2304
2305// Pre-requisite: wp != NULL.
2306static GDBStoppointType
2307GetGDBStoppointType (Watchpoint *wp)
2308{
2309    assert(wp);
2310    bool watch_read = wp->WatchpointRead();
2311    bool watch_write = wp->WatchpointWrite();
2312
2313    // watch_read and watch_write cannot both be false.
2314    assert(watch_read || watch_write);
2315    if (watch_read && watch_write)
2316        return eWatchpointReadWrite;
2317    else if (watch_read)
2318        return eWatchpointRead;
2319    else // Must be watch_write, then.
2320        return eWatchpointWrite;
2321}
2322
2323Error
2324ProcessGDBRemote::EnableWatchpoint (Watchpoint *wp)
2325{
2326    Error error;
2327    if (wp)
2328    {
2329        user_id_t watchID = wp->GetID();
2330        addr_t addr = wp->GetLoadAddress();
2331        LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_WATCHPOINTS));
2332        if (log)
2333            log->Printf ("ProcessGDBRemote::EnableWatchpoint(watchID = %llu)", watchID);
2334        if (wp->IsEnabled())
2335        {
2336            if (log)
2337                log->Printf("ProcessGDBRemote::EnableWatchpoint(watchID = %llu) addr = 0x%8.8llx: watchpoint already enabled.", watchID, (uint64_t)addr);
2338            return error;
2339        }
2340
2341        GDBStoppointType type = GetGDBStoppointType(wp);
2342        // Pass down an appropriate z/Z packet...
2343        if (m_gdb_comm.SupportsGDBStoppointPacket (type))
2344        {
2345            if (m_gdb_comm.SendGDBStoppointTypePacket(type, true, addr, wp->GetByteSize()) == 0)
2346            {
2347                wp->SetEnabled(true);
2348                return error;
2349            }
2350            else
2351                error.SetErrorString("sending gdb watchpoint packet failed");
2352        }
2353        else
2354            error.SetErrorString("watchpoints not supported");
2355    }
2356    else
2357    {
2358        error.SetErrorString("Watchpoint argument was NULL.");
2359    }
2360    if (error.Success())
2361        error.SetErrorToGenericError();
2362    return error;
2363}
2364
2365Error
2366ProcessGDBRemote::DisableWatchpoint (Watchpoint *wp)
2367{
2368    Error error;
2369    if (wp)
2370    {
2371        user_id_t watchID = wp->GetID();
2372
2373        LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_WATCHPOINTS));
2374
2375        addr_t addr = wp->GetLoadAddress();
2376        if (log)
2377            log->Printf ("ProcessGDBRemote::DisableWatchpoint (watchID = %llu) addr = 0x%8.8llx", watchID, (uint64_t)addr);
2378
2379        if (!wp->IsEnabled())
2380        {
2381            if (log)
2382                log->Printf ("ProcessGDBRemote::DisableWatchpoint (watchID = %llu) addr = 0x%8.8llx -- SUCCESS (already disabled)", watchID, (uint64_t)addr);
2383            // See also 'class WatchpointSentry' within StopInfo.cpp.
2384            // This disabling attempt might come from the user-supplied actions, we'll route it in order for
2385            // the watchpoint object to intelligently process this action.
2386            wp->SetEnabled(false);
2387            return error;
2388        }
2389
2390        if (wp->IsHardware())
2391        {
2392            GDBStoppointType type = GetGDBStoppointType(wp);
2393            // Pass down an appropriate z/Z packet...
2394            if (m_gdb_comm.SendGDBStoppointTypePacket(type, false, addr, wp->GetByteSize()) == 0)
2395            {
2396                wp->SetEnabled(false);
2397                return error;
2398            }
2399            else
2400                error.SetErrorString("sending gdb watchpoint packet failed");
2401        }
2402        // TODO: clear software watchpoints if we implement them
2403    }
2404    else
2405    {
2406        error.SetErrorString("Watchpoint argument was NULL.");
2407    }
2408    if (error.Success())
2409        error.SetErrorToGenericError();
2410    return error;
2411}
2412
2413void
2414ProcessGDBRemote::Clear()
2415{
2416    m_flags = 0;
2417    m_thread_list.Clear();
2418}
2419
2420Error
2421ProcessGDBRemote::DoSignal (int signo)
2422{
2423    Error error;
2424    LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_PROCESS));
2425    if (log)
2426        log->Printf ("ProcessGDBRemote::DoSignal (signal = %d)", signo);
2427
2428    if (!m_gdb_comm.SendAsyncSignal (signo))
2429        error.SetErrorStringWithFormat("failed to send signal %i", signo);
2430    return error;
2431}
2432
2433Error
2434ProcessGDBRemote::StartDebugserverProcess (const char *debugserver_url)
2435{
2436    ProcessLaunchInfo launch_info;
2437    return StartDebugserverProcess(debugserver_url, launch_info);
2438}
2439
2440Error
2441ProcessGDBRemote::StartDebugserverProcess (const char *debugserver_url, const ProcessInfo &process_info)    // The connection string to use in the spawned debugserver ("localhost:1234" or "/dev/tty...")
2442{
2443    Error error;
2444    if (m_debugserver_pid == LLDB_INVALID_PROCESS_ID)
2445    {
2446        // If we locate debugserver, keep that located version around
2447        static FileSpec g_debugserver_file_spec;
2448
2449        ProcessLaunchInfo debugserver_launch_info;
2450        char debugserver_path[PATH_MAX];
2451        FileSpec &debugserver_file_spec = debugserver_launch_info.GetExecutableFile();
2452
2453        // Always check to see if we have an environment override for the path
2454        // to the debugserver to use and use it if we do.
2455        const char *env_debugserver_path = getenv("LLDB_DEBUGSERVER_PATH");
2456        if (env_debugserver_path)
2457            debugserver_file_spec.SetFile (env_debugserver_path, false);
2458        else
2459            debugserver_file_spec = g_debugserver_file_spec;
2460        bool debugserver_exists = debugserver_file_spec.Exists();
2461        if (!debugserver_exists)
2462        {
2463            // The debugserver binary is in the LLDB.framework/Resources
2464            // directory.
2465            if (Host::GetLLDBPath (ePathTypeSupportExecutableDir, debugserver_file_spec))
2466            {
2467                debugserver_file_spec.GetFilename().SetCString(DEBUGSERVER_BASENAME);
2468                debugserver_exists = debugserver_file_spec.Exists();
2469                if (debugserver_exists)
2470                {
2471                    g_debugserver_file_spec = debugserver_file_spec;
2472                }
2473                else
2474                {
2475                    g_debugserver_file_spec.Clear();
2476                    debugserver_file_spec.Clear();
2477                }
2478            }
2479        }
2480
2481        if (debugserver_exists)
2482        {
2483            debugserver_file_spec.GetPath (debugserver_path, sizeof(debugserver_path));
2484
2485            m_stdio_communication.Clear();
2486
2487            LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS));
2488
2489            Args &debugserver_args = debugserver_launch_info.GetArguments();
2490            char arg_cstr[PATH_MAX];
2491
2492            // Start args with "debugserver /file/path -r --"
2493            debugserver_args.AppendArgument(debugserver_path);
2494            debugserver_args.AppendArgument(debugserver_url);
2495            // use native registers, not the GDB registers
2496            debugserver_args.AppendArgument("--native-regs");
2497            // make debugserver run in its own session so signals generated by
2498            // special terminal key sequences (^C) don't affect debugserver
2499            debugserver_args.AppendArgument("--setsid");
2500
2501            const char *env_debugserver_log_file = getenv("LLDB_DEBUGSERVER_LOG_FILE");
2502            if (env_debugserver_log_file)
2503            {
2504                ::snprintf (arg_cstr, sizeof(arg_cstr), "--log-file=%s", env_debugserver_log_file);
2505                debugserver_args.AppendArgument(arg_cstr);
2506            }
2507
2508            const char *env_debugserver_log_flags = getenv("LLDB_DEBUGSERVER_LOG_FLAGS");
2509            if (env_debugserver_log_flags)
2510            {
2511                ::snprintf (arg_cstr, sizeof(arg_cstr), "--log-flags=%s", env_debugserver_log_flags);
2512                debugserver_args.AppendArgument(arg_cstr);
2513            }
2514//            debugserver_args.AppendArgument("--log-file=/tmp/debugserver.txt");
2515//            debugserver_args.AppendArgument("--log-flags=0x802e0e");
2516
2517            // We currently send down all arguments, attach pids, or attach
2518            // process names in dedicated GDB server packets, so we don't need
2519            // to pass them as arguments. This is currently because of all the
2520            // things we need to setup prior to launching: the environment,
2521            // current working dir, file actions, etc.
2522#if 0
2523            // Now append the program arguments
2524            if (inferior_argv)
2525            {
2526                // Terminate the debugserver args so we can now append the inferior args
2527                debugserver_args.AppendArgument("--");
2528
2529                for (int i = 0; inferior_argv[i] != NULL; ++i)
2530                    debugserver_args.AppendArgument (inferior_argv[i]);
2531            }
2532            else if (attach_pid != LLDB_INVALID_PROCESS_ID)
2533            {
2534                ::snprintf (arg_cstr, sizeof(arg_cstr), "--attach=%u", attach_pid);
2535                debugserver_args.AppendArgument (arg_cstr);
2536            }
2537            else if (attach_name && attach_name[0])
2538            {
2539                if (wait_for_launch)
2540                    debugserver_args.AppendArgument ("--waitfor");
2541                else
2542                    debugserver_args.AppendArgument ("--attach");
2543                debugserver_args.AppendArgument (attach_name);
2544            }
2545#endif
2546
2547            ProcessLaunchInfo::FileAction file_action;
2548
2549            // Close STDIN, STDOUT and STDERR. We might need to redirect them
2550            // to "/dev/null" if we run into any problems.
2551            file_action.Close (STDIN_FILENO);
2552            debugserver_launch_info.AppendFileAction (file_action);
2553            file_action.Close (STDOUT_FILENO);
2554            debugserver_launch_info.AppendFileAction (file_action);
2555            file_action.Close (STDERR_FILENO);
2556            debugserver_launch_info.AppendFileAction (file_action);
2557
2558            if (log)
2559            {
2560                StreamString strm;
2561                debugserver_args.Dump (&strm);
2562                log->Printf("%s arguments:\n%s", debugserver_args.GetArgumentAtIndex(0), strm.GetData());
2563            }
2564
2565            debugserver_launch_info.SetMonitorProcessCallback (MonitorDebugserverProcess, this, false);
2566            debugserver_launch_info.SetUserID(process_info.GetUserID());
2567
2568            error = Host::LaunchProcess(debugserver_launch_info);
2569
2570            if (error.Success ())
2571                m_debugserver_pid = debugserver_launch_info.GetProcessID();
2572            else
2573                m_debugserver_pid = LLDB_INVALID_PROCESS_ID;
2574
2575            if (error.Fail() || log)
2576                error.PutToLog(log.get(), "Host::LaunchProcess (launch_info) => pid=%llu, path='%s'", m_debugserver_pid, debugserver_path);
2577        }
2578        else
2579        {
2580            error.SetErrorStringWithFormat ("unable to locate " DEBUGSERVER_BASENAME);
2581        }
2582
2583        if (m_debugserver_pid != LLDB_INVALID_PROCESS_ID)
2584            StartAsyncThread ();
2585    }
2586    return error;
2587}
2588
2589bool
2590ProcessGDBRemote::MonitorDebugserverProcess
2591(
2592    void *callback_baton,
2593    lldb::pid_t debugserver_pid,
2594    bool exited,        // True if the process did exit
2595    int signo,          // Zero for no signal
2596    int exit_status     // Exit value of process if signal is zero
2597)
2598{
2599    // The baton is a "ProcessGDBRemote *". Now this class might be gone
2600    // and might not exist anymore, so we need to carefully try to get the
2601    // target for this process first since we have a race condition when
2602    // we are done running between getting the notice that the inferior
2603    // process has died and the debugserver that was debugging this process.
2604    // In our test suite, we are also continually running process after
2605    // process, so we must be very careful to make sure:
2606    // 1 - process object hasn't been deleted already
2607    // 2 - that a new process object hasn't been recreated in its place
2608
2609    // "debugserver_pid" argument passed in is the process ID for
2610    // debugserver that we are tracking...
2611    LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_PROCESS));
2612
2613    ProcessGDBRemote *process = (ProcessGDBRemote *)callback_baton;
2614
2615    // Get a shared pointer to the target that has a matching process pointer.
2616    // This target could be gone, or the target could already have a new process
2617    // object inside of it
2618    TargetSP target_sp (Debugger::FindTargetWithProcess(process));
2619
2620    if (log)
2621        log->Printf ("ProcessGDBRemote::MonitorDebugserverProcess (baton=%p, pid=%llu, signo=%i (0x%x), exit_status=%i)", callback_baton, debugserver_pid, signo, signo, exit_status);
2622
2623    if (target_sp)
2624    {
2625        // We found a process in a target that matches, but another thread
2626        // might be in the process of launching a new process that will
2627        // soon replace it, so get a shared pointer to the process so we
2628        // can keep it alive.
2629        ProcessSP process_sp (target_sp->GetProcessSP());
2630        // Now we have a shared pointer to the process that can't go away on us
2631        // so we now make sure it was the same as the one passed in, and also make
2632        // sure that our previous "process *" didn't get deleted and have a new
2633        // "process *" created in its place with the same pointer. To verify this
2634        // we make sure the process has our debugserver process ID. If we pass all
2635        // of these tests, then we are sure that this process is the one we were
2636        // looking for.
2637        if (process_sp && process == process_sp.get() && process->m_debugserver_pid == debugserver_pid)
2638        {
2639            // Sleep for a half a second to make sure our inferior process has
2640            // time to set its exit status before we set it incorrectly when
2641            // both the debugserver and the inferior process shut down.
2642            usleep (500000);
2643            // If our process hasn't yet exited, debugserver might have died.
2644            // If the process did exit, the we are reaping it.
2645            const StateType state = process->GetState();
2646
2647            if (process->m_debugserver_pid != LLDB_INVALID_PROCESS_ID &&
2648                state != eStateInvalid &&
2649                state != eStateUnloaded &&
2650                state != eStateExited &&
2651                state != eStateDetached)
2652            {
2653                char error_str[1024];
2654                if (signo)
2655                {
2656                    const char *signal_cstr = process->GetUnixSignals().GetSignalAsCString (signo);
2657                    if (signal_cstr)
2658                        ::snprintf (error_str, sizeof (error_str), DEBUGSERVER_BASENAME " died with signal %s", signal_cstr);
2659                    else
2660                        ::snprintf (error_str, sizeof (error_str), DEBUGSERVER_BASENAME " died with signal %i", signo);
2661                }
2662                else
2663                {
2664                    ::snprintf (error_str, sizeof (error_str), DEBUGSERVER_BASENAME " died with an exit status of 0x%8.8x", exit_status);
2665                }
2666
2667                process->SetExitStatus (-1, error_str);
2668            }
2669            // Debugserver has exited we need to let our ProcessGDBRemote
2670            // know that it no longer has a debugserver instance
2671            process->m_debugserver_pid = LLDB_INVALID_PROCESS_ID;
2672        }
2673    }
2674    return true;
2675}
2676
2677void
2678ProcessGDBRemote::KillDebugserverProcess ()
2679{
2680    if (m_debugserver_pid != LLDB_INVALID_PROCESS_ID)
2681    {
2682        ::kill (m_debugserver_pid, SIGINT);
2683        m_debugserver_pid = LLDB_INVALID_PROCESS_ID;
2684    }
2685}
2686
2687void
2688ProcessGDBRemote::Initialize()
2689{
2690    static bool g_initialized = false;
2691
2692    if (g_initialized == false)
2693    {
2694        g_initialized = true;
2695        PluginManager::RegisterPlugin (GetPluginNameStatic(),
2696                                       GetPluginDescriptionStatic(),
2697                                       CreateInstance);
2698
2699        Log::Callbacks log_callbacks = {
2700            ProcessGDBRemoteLog::DisableLog,
2701            ProcessGDBRemoteLog::EnableLog,
2702            ProcessGDBRemoteLog::ListLogCategories
2703        };
2704
2705        Log::RegisterLogChannel (ProcessGDBRemote::GetPluginNameStatic(), log_callbacks);
2706    }
2707}
2708
2709bool
2710ProcessGDBRemote::StartAsyncThread ()
2711{
2712    LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_PROCESS));
2713
2714    if (log)
2715        log->Printf ("ProcessGDBRemote::%s ()", __FUNCTION__);
2716
2717    // Create a thread that watches our internal state and controls which
2718    // events make it to clients (into the DCProcess event queue).
2719    m_async_thread = Host::ThreadCreate ("<lldb.process.gdb-remote.async>", ProcessGDBRemote::AsyncThread, this, NULL);
2720    return IS_VALID_LLDB_HOST_THREAD(m_async_thread);
2721}
2722
2723void
2724ProcessGDBRemote::StopAsyncThread ()
2725{
2726    LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_PROCESS));
2727
2728    if (log)
2729        log->Printf ("ProcessGDBRemote::%s ()", __FUNCTION__);
2730
2731    m_async_broadcaster.BroadcastEvent (eBroadcastBitAsyncThreadShouldExit);
2732
2733    //  This will shut down the async thread.
2734    m_gdb_comm.Disconnect();    // Disconnect from the debug server.
2735
2736    // Stop the stdio thread
2737    if (IS_VALID_LLDB_HOST_THREAD(m_async_thread))
2738    {
2739        Host::ThreadJoin (m_async_thread, NULL, NULL);
2740    }
2741}
2742
2743
2744void *
2745ProcessGDBRemote::AsyncThread (void *arg)
2746{
2747    ProcessGDBRemote *process = (ProcessGDBRemote*) arg;
2748
2749    LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS));
2750    if (log)
2751        log->Printf ("ProcessGDBRemote::%s (arg = %p, pid = %llu) thread starting...", __FUNCTION__, arg, process->GetID());
2752
2753    Listener listener ("ProcessGDBRemote::AsyncThread");
2754    EventSP event_sp;
2755    const uint32_t desired_event_mask = eBroadcastBitAsyncContinue |
2756                                        eBroadcastBitAsyncThreadShouldExit;
2757
2758    if (listener.StartListeningForEvents (&process->m_async_broadcaster, desired_event_mask) == desired_event_mask)
2759    {
2760        listener.StartListeningForEvents (&process->m_gdb_comm, Communication::eBroadcastBitReadThreadDidExit);
2761
2762        bool done = false;
2763        while (!done)
2764        {
2765            if (log)
2766                log->Printf ("ProcessGDBRemote::%s (arg = %p, pid = %llu) listener.WaitForEvent (NULL, event_sp)...", __FUNCTION__, arg, process->GetID());
2767            if (listener.WaitForEvent (NULL, event_sp))
2768            {
2769                const uint32_t event_type = event_sp->GetType();
2770                if (event_sp->BroadcasterIs (&process->m_async_broadcaster))
2771                {
2772                    if (log)
2773                        log->Printf ("ProcessGDBRemote::%s (arg = %p, pid = %llu) Got an event of type: %d...", __FUNCTION__, arg, process->GetID(), event_type);
2774
2775                    switch (event_type)
2776                    {
2777                        case eBroadcastBitAsyncContinue:
2778                            {
2779                                const EventDataBytes *continue_packet = EventDataBytes::GetEventDataFromEvent(event_sp.get());
2780
2781                                if (continue_packet)
2782                                {
2783                                    const char *continue_cstr = (const char *)continue_packet->GetBytes ();
2784                                    const size_t continue_cstr_len = continue_packet->GetByteSize ();
2785                                    if (log)
2786                                        log->Printf ("ProcessGDBRemote::%s (arg = %p, pid = %llu) got eBroadcastBitAsyncContinue: %s", __FUNCTION__, arg, process->GetID(), continue_cstr);
2787
2788                                    if (::strstr (continue_cstr, "vAttach") == NULL)
2789                                        process->SetPrivateState(eStateRunning);
2790                                    StringExtractorGDBRemote response;
2791                                    StateType stop_state = process->GetGDBRemote().SendContinuePacketAndWaitForResponse (process, continue_cstr, continue_cstr_len, response);
2792
2793                                    // We need to immediately clear the thread ID list so we are sure to get a valid list of threads.
2794                                    // The thread ID list might be contained within the "response", or the stop reply packet that
2795                                    // caused the stop. So clear it now before we give the stop reply packet to the process
2796                                    // using the process->SetLastStopPacket()...
2797                                    process->ClearThreadIDList ();
2798
2799                                    switch (stop_state)
2800                                    {
2801                                    case eStateStopped:
2802                                    case eStateCrashed:
2803                                    case eStateSuspended:
2804                                        process->SetLastStopPacket (response);
2805                                        process->SetPrivateState (stop_state);
2806                                        break;
2807
2808                                    case eStateExited:
2809                                        process->SetLastStopPacket (response);
2810                                        process->ClearThreadIDList();
2811                                        response.SetFilePos(1);
2812                                        process->SetExitStatus(response.GetHexU8(), NULL);
2813                                        done = true;
2814                                        break;
2815
2816                                    case eStateInvalid:
2817                                        process->SetExitStatus(-1, "lost connection");
2818                                        break;
2819
2820                                    default:
2821                                        process->SetPrivateState (stop_state);
2822                                        break;
2823                                    }
2824                                }
2825                            }
2826                            break;
2827
2828                        case eBroadcastBitAsyncThreadShouldExit:
2829                            if (log)
2830                                log->Printf ("ProcessGDBRemote::%s (arg = %p, pid = %llu) got eBroadcastBitAsyncThreadShouldExit...", __FUNCTION__, arg, process->GetID());
2831                            done = true;
2832                            break;
2833
2834                        default:
2835                            if (log)
2836                                log->Printf ("ProcessGDBRemote::%s (arg = %p, pid = %llu) got unknown event 0x%8.8x", __FUNCTION__, arg, process->GetID(), event_type);
2837                            done = true;
2838                            break;
2839                    }
2840                }
2841                else if (event_sp->BroadcasterIs (&process->m_gdb_comm))
2842                {
2843                    if (event_type & Communication::eBroadcastBitReadThreadDidExit)
2844                    {
2845                        process->SetExitStatus (-1, "lost connection");
2846                        done = true;
2847                    }
2848                }
2849            }
2850            else
2851            {
2852                if (log)
2853                    log->Printf ("ProcessGDBRemote::%s (arg = %p, pid = %llu) listener.WaitForEvent (NULL, event_sp) => false", __FUNCTION__, arg, process->GetID());
2854                done = true;
2855            }
2856        }
2857    }
2858
2859    if (log)
2860        log->Printf ("ProcessGDBRemote::%s (arg = %p, pid = %llu) thread exiting...", __FUNCTION__, arg, process->GetID());
2861
2862    process->m_async_thread = LLDB_INVALID_HOST_THREAD;
2863    return NULL;
2864}
2865
2866const char *
2867ProcessGDBRemote::GetDispatchQueueNameForThread
2868(
2869    addr_t thread_dispatch_qaddr,
2870    std::string &dispatch_queue_name
2871)
2872{
2873    dispatch_queue_name.clear();
2874    if (thread_dispatch_qaddr != 0 && thread_dispatch_qaddr != LLDB_INVALID_ADDRESS)
2875    {
2876        // Cache the dispatch_queue_offsets_addr value so we don't always have
2877        // to look it up
2878        if (m_dispatch_queue_offsets_addr == LLDB_INVALID_ADDRESS)
2879        {
2880            static ConstString g_dispatch_queue_offsets_symbol_name ("dispatch_queue_offsets");
2881            const Symbol *dispatch_queue_offsets_symbol = NULL;
2882            ModuleSpec libSystem_module_spec (FileSpec("libSystem.B.dylib", false));
2883            ModuleSP module_sp(GetTarget().GetImages().FindFirstModule (libSystem_module_spec));
2884            if (module_sp)
2885                dispatch_queue_offsets_symbol = module_sp->FindFirstSymbolWithNameAndType (g_dispatch_queue_offsets_symbol_name, eSymbolTypeData);
2886
2887            if (dispatch_queue_offsets_symbol == NULL)
2888            {
2889                ModuleSpec libdispatch_module_spec (FileSpec("libdispatch.dylib", false));
2890                module_sp = GetTarget().GetImages().FindFirstModule (libdispatch_module_spec);
2891                if (module_sp)
2892                    dispatch_queue_offsets_symbol = module_sp->FindFirstSymbolWithNameAndType (g_dispatch_queue_offsets_symbol_name, eSymbolTypeData);
2893            }
2894            if (dispatch_queue_offsets_symbol)
2895                m_dispatch_queue_offsets_addr = dispatch_queue_offsets_symbol->GetAddress().GetLoadAddress(&m_target);
2896
2897            if (m_dispatch_queue_offsets_addr == LLDB_INVALID_ADDRESS)
2898                return NULL;
2899        }
2900
2901        uint8_t memory_buffer[8];
2902        DataExtractor data (memory_buffer,
2903                            sizeof(memory_buffer),
2904                            m_target.GetArchitecture().GetByteOrder(),
2905                            m_target.GetArchitecture().GetAddressByteSize());
2906
2907        // Excerpt from src/queue_private.h
2908        struct dispatch_queue_offsets_s
2909        {
2910            uint16_t dqo_version;
2911            uint16_t dqo_label;
2912            uint16_t dqo_label_size;
2913        } dispatch_queue_offsets;
2914
2915
2916        Error error;
2917        if (ReadMemory (m_dispatch_queue_offsets_addr, memory_buffer, sizeof(dispatch_queue_offsets), error) == sizeof(dispatch_queue_offsets))
2918        {
2919            uint32_t data_offset = 0;
2920            if (data.GetU16(&data_offset, &dispatch_queue_offsets.dqo_version, sizeof(dispatch_queue_offsets)/sizeof(uint16_t)))
2921            {
2922                if (ReadMemory (thread_dispatch_qaddr, &memory_buffer, data.GetAddressByteSize(), error) == data.GetAddressByteSize())
2923                {
2924                    data_offset = 0;
2925                    lldb::addr_t queue_addr = data.GetAddress(&data_offset);
2926                    lldb::addr_t label_addr = queue_addr + dispatch_queue_offsets.dqo_label;
2927                    dispatch_queue_name.resize(dispatch_queue_offsets.dqo_label_size, '\0');
2928                    size_t bytes_read = ReadMemory (label_addr, &dispatch_queue_name[0], dispatch_queue_offsets.dqo_label_size, error);
2929                    if (bytes_read < dispatch_queue_offsets.dqo_label_size)
2930                        dispatch_queue_name.erase (bytes_read);
2931                }
2932            }
2933        }
2934    }
2935    if (dispatch_queue_name.empty())
2936        return NULL;
2937    return dispatch_queue_name.c_str();
2938}
2939
2940//uint32_t
2941//ProcessGDBRemote::ListProcessesMatchingName (const char *name, StringList &matches, std::vector<lldb::pid_t> &pids)
2942//{
2943//    // If we are planning to launch the debugserver remotely, then we need to fire up a debugserver
2944//    // process and ask it for the list of processes. But if we are local, we can let the Host do it.
2945//    if (m_local_debugserver)
2946//    {
2947//        return Host::ListProcessesMatchingName (name, matches, pids);
2948//    }
2949//    else
2950//    {
2951//        // FIXME: Implement talking to the remote debugserver.
2952//        return 0;
2953//    }
2954//
2955//}
2956//
2957bool
2958ProcessGDBRemote::NewThreadNotifyBreakpointHit (void *baton,
2959                             lldb_private::StoppointCallbackContext *context,
2960                             lldb::user_id_t break_id,
2961                             lldb::user_id_t break_loc_id)
2962{
2963    // I don't think I have to do anything here, just make sure I notice the new thread when it starts to
2964    // run so I can stop it if that's what I want to do.
2965    LogSP log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));
2966    if (log)
2967        log->Printf("Hit New Thread Notification breakpoint.");
2968    return false;
2969}
2970
2971
2972bool
2973ProcessGDBRemote::StartNoticingNewThreads()
2974{
2975    LogSP log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));
2976    if (m_thread_create_bp_sp)
2977    {
2978        if (log && log->GetVerbose())
2979            log->Printf("Enabled noticing new thread breakpoint.");
2980        m_thread_create_bp_sp->SetEnabled(true);
2981    }
2982    else
2983    {
2984        PlatformSP platform_sp (m_target.GetPlatform());
2985        if (platform_sp)
2986        {
2987            m_thread_create_bp_sp = platform_sp->SetThreadCreationBreakpoint(m_target);
2988            if (m_thread_create_bp_sp)
2989            {
2990                if (log && log->GetVerbose())
2991                    log->Printf("Successfully created new thread notification breakpoint %i", m_thread_create_bp_sp->GetID());
2992                m_thread_create_bp_sp->SetCallback (ProcessGDBRemote::NewThreadNotifyBreakpointHit, this, true);
2993            }
2994            else
2995            {
2996                if (log)
2997                    log->Printf("Failed to create new thread notification breakpoint.");
2998            }
2999        }
3000    }
3001    return m_thread_create_bp_sp.get() != NULL;
3002}
3003
3004bool
3005ProcessGDBRemote::StopNoticingNewThreads()
3006{
3007    LogSP log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));
3008    if (log && log->GetVerbose())
3009        log->Printf ("Disabling new thread notification breakpoint.");
3010
3011    if (m_thread_create_bp_sp)
3012        m_thread_create_bp_sp->SetEnabled(false);
3013
3014    return true;
3015}
3016
3017lldb_private::DynamicLoader *
3018ProcessGDBRemote::GetDynamicLoader ()
3019{
3020    if (m_dyld_ap.get() == NULL)
3021        m_dyld_ap.reset (DynamicLoader::FindPlugin(this, m_dyld_plugin_name.empty() ? NULL : m_dyld_plugin_name.c_str()));
3022    return m_dyld_ap.get();
3023}
3024
3025
3026class CommandObjectProcessGDBRemotePacketHistory : public CommandObjectParsed
3027{
3028private:
3029
3030public:
3031    CommandObjectProcessGDBRemotePacketHistory(CommandInterpreter &interpreter) :
3032    CommandObjectParsed (interpreter,
3033                         "process plugin packet history",
3034                         "Dumps the packet history buffer. ",
3035                         NULL)
3036    {
3037    }
3038
3039    ~CommandObjectProcessGDBRemotePacketHistory ()
3040    {
3041    }
3042
3043    bool
3044    DoExecute (Args& command, CommandReturnObject &result)
3045    {
3046        const size_t argc = command.GetArgumentCount();
3047        if (argc == 0)
3048        {
3049            ProcessGDBRemote *process = (ProcessGDBRemote *)m_interpreter.GetExecutionContext().GetProcessPtr();
3050            if (process)
3051            {
3052                process->GetGDBRemote().DumpHistory(result.GetOutputStream());
3053                result.SetStatus (eReturnStatusSuccessFinishResult);
3054                return true;
3055            }
3056        }
3057        else
3058        {
3059            result.AppendErrorWithFormat ("'%s' takes no arguments", m_cmd_name.c_str());
3060        }
3061        result.SetStatus (eReturnStatusFailed);
3062        return false;
3063    }
3064};
3065
3066class CommandObjectProcessGDBRemotePacketSend : public CommandObjectParsed
3067{
3068private:
3069
3070public:
3071    CommandObjectProcessGDBRemotePacketSend(CommandInterpreter &interpreter) :
3072        CommandObjectParsed (interpreter,
3073                             "process plugin packet send",
3074                             "Send a custom packet through the GDB remote protocol and print the answer. "
3075                             "The packet header and footer will automatically be added to the packet prior to sending and stripped from the result.",
3076                             NULL)
3077    {
3078    }
3079
3080    ~CommandObjectProcessGDBRemotePacketSend ()
3081    {
3082    }
3083
3084    bool
3085    DoExecute (Args& command, CommandReturnObject &result)
3086    {
3087        const size_t argc = command.GetArgumentCount();
3088        if (argc == 0)
3089        {
3090            result.AppendErrorWithFormat ("'%s' takes a one or more packet content arguments", m_cmd_name.c_str());
3091            result.SetStatus (eReturnStatusFailed);
3092            return false;
3093        }
3094
3095        ProcessGDBRemote *process = (ProcessGDBRemote *)m_interpreter.GetExecutionContext().GetProcessPtr();
3096        if (process)
3097        {
3098            const StateType state = process->GetState();
3099
3100            if (StateIsStoppedState (state, true))
3101            {
3102                for (size_t i=0; i<argc; ++ i)
3103                {
3104                    const char *packet_cstr = command.GetArgumentAtIndex(0);
3105                    bool send_async = false;
3106                    StringExtractorGDBRemote response;
3107                    process->GetGDBRemote().SendPacketAndWaitForResponse(packet_cstr, response, send_async);
3108                    result.SetStatus (eReturnStatusSuccessFinishResult);
3109                    Stream &output_strm = result.GetOutputStream();
3110                    output_strm.Printf ("  packet: %s\n", packet_cstr);
3111                    const std::string &response_str = response.GetStringRef();
3112                    if (response_str.empty())
3113                        output_strm.PutCString ("response: \nerror: UNIMPLEMENTED\n");
3114                    else
3115                        output_strm.Printf ("response: %s\n", response.GetStringRef().c_str());
3116                }
3117            }
3118            else
3119            {
3120                result.AppendErrorWithFormat ("process must be stopped in order to send GDB remote packets, state is %s", StateAsCString (state));
3121                result.SetStatus (eReturnStatusFailed);
3122                return false;
3123            }
3124
3125        }
3126        return true;
3127    }
3128};
3129
3130class CommandObjectProcessGDBRemotePacket : public CommandObjectMultiword
3131{
3132private:
3133
3134public:
3135    CommandObjectProcessGDBRemotePacket(CommandInterpreter &interpreter) :
3136        CommandObjectMultiword (interpreter,
3137                                "process plugin packet",
3138                                "Commands that deal with GDB remote packets.",
3139                                NULL)
3140    {
3141        LoadSubCommand ("history", CommandObjectSP (new CommandObjectProcessGDBRemotePacketHistory (interpreter)));
3142        LoadSubCommand ("send", CommandObjectSP (new CommandObjectProcessGDBRemotePacketSend (interpreter)));
3143    }
3144
3145    ~CommandObjectProcessGDBRemotePacket ()
3146    {
3147    }
3148};
3149
3150class CommandObjectMultiwordProcessGDBRemote : public CommandObjectMultiword
3151{
3152public:
3153    CommandObjectMultiwordProcessGDBRemote (CommandInterpreter &interpreter) :
3154        CommandObjectMultiword (interpreter,
3155                                "process plugin",
3156                                "A set of commands for operating on a ProcessGDBRemote process.",
3157                                "process plugin <subcommand> [<subcommand-options>]")
3158    {
3159        LoadSubCommand ("packet", CommandObjectSP (new CommandObjectProcessGDBRemotePacket    (interpreter)));
3160    }
3161
3162    ~CommandObjectMultiwordProcessGDBRemote ()
3163    {
3164    }
3165};
3166
3167CommandObject *
3168ProcessGDBRemote::GetPluginCommandObject()
3169{
3170    if (!m_command_sp)
3171        m_command_sp.reset (new CommandObjectMultiwordProcessGDBRemote (GetTarget().GetDebugger().GetCommandInterpreter()));
3172    return m_command_sp.get();
3173}
3174