[Lldb-commits] [lldb] r236705 - Implement -target-attach and -target-detach

Ilia K ki.stfu at gmail.com
Thu May 7 00:38:49 PDT 2015


Author: ki.stfu
Date: Thu May  7 02:38:49 2015
New Revision: 236705

URL: http://llvm.org/viewvc/llvm-project?rev=236705&view=rev
Log:
Implement -target-attach and -target-detach

Summary:
This changes add -target-attach and -target-detach. 

-target-attach allows lldb-mi to attach to an existing process by it's process id, matching gdb mi's syntax of '-target-attach <pid'. Additionally, support has been added for attaching to a process by name using '-target-attach -n <name>'. Combining this with --waitfor will allow lldb mi to attach to a process by name when the process starts. 

-target-detach simply detaches from the current process

Patch from chuckr at microsoft.com

Test Plan: I have added three tests, one each for -target-attach <pid>, -target-attach -n <name>, and -target-attach -n <name> --waitfor

Reviewers: paulmaybee, abidh, ChuckR

Subscribers: greggm, lldb-commits

Differential Revision: http://reviews.llvm.org/D9484

Added:
    lldb/trunk/test/tools/lldb-mi/target/
    lldb/trunk/test/tools/lldb-mi/target/Makefile
    lldb/trunk/test/tools/lldb-mi/target/TestMiTarget.py
    lldb/trunk/test/tools/lldb-mi/target/test_attach.cpp
Modified:
    lldb/trunk/tools/lldb-mi/MICmdCmdTarget.cpp
    lldb/trunk/tools/lldb-mi/MICmdCmdTarget.h
    lldb/trunk/tools/lldb-mi/MICmdCommands.cpp
    lldb/trunk/tools/lldb-mi/MICmnResources.cpp
    lldb/trunk/tools/lldb-mi/MICmnResources.h
    lldb/trunk/tools/lldb-mi/MIExtensions.txt

Added: lldb/trunk/test/tools/lldb-mi/target/Makefile
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/tools/lldb-mi/target/Makefile?rev=236705&view=auto
==============================================================================
--- lldb/trunk/test/tools/lldb-mi/target/Makefile (added)
+++ lldb/trunk/test/tools/lldb-mi/target/Makefile Thu May  7 02:38:49 2015
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+CXX_SOURCES := test_attach.cpp
+
+include $(LEVEL)/Makefile.rules

Added: lldb/trunk/test/tools/lldb-mi/target/TestMiTarget.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/tools/lldb-mi/target/TestMiTarget.py?rev=236705&view=auto
==============================================================================
--- lldb/trunk/test/tools/lldb-mi/target/TestMiTarget.py (added)
+++ lldb/trunk/test/tools/lldb-mi/target/TestMiTarget.py Thu May  7 02:38:49 2015
@@ -0,0 +1,125 @@
+"""
+Test lldb-mi -target-xxx commands.
+"""
+
+import lldbmi_testcase
+from lldbtest import *
+import unittest2
+
+class MiTargetTestCase(lldbmi_testcase.MiTestCaseBase):
+
+    mydir = TestBase.compute_mydir(__file__)
+
+    @lldbmi_test
+    @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows")
+    @skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races
+    @skipIfLinux # cannot attach to process on linux
+    def test_lldbmi_target_attach_wait_for(self):
+        """Test that 'lldb-mi --interpreter' works for -target-attach -n <name> --waitfor."""
+           
+        # Build target executable with unique name
+        exeName = self.testMethodName
+        d = {'EXE': exeName}
+        self.buildProgram("test_attach.cpp", exeName)
+        self.addTearDownCleanup(dictionary=d)
+        
+        self.spawnLldbMi(args = None)
+        
+        # Load executable
+        # FIXME: -file-exec-and-sybmols is not required for target attach, but the test will not pass without this
+        self.runCmd("-file-exec-and-symbols %s" % exeName)
+        self.expect("\^done")
+        
+        # Set up attach
+        self.runCmd("-target-attach -n %s --waitfor" % exeName)
+        time.sleep(4) # Give attach time to setup
+              
+        # Start target process
+        self.spawnSubprocess(os.path.join(os.path.dirname(__file__), exeName));
+        self.addTearDownHook(self.cleanupSubprocesses)
+        self.expect("\^done")
+        
+        # Set breakpoint on printf
+        line = line_number('test_attach.cpp', '// BP_i++')
+        self.runCmd("-break-insert -f test_attach.cpp:%d" % line)
+        self.expect("\^done,bkpt={number=\"1\"")
+        
+        # Continue to breakpoint
+        self.runCmd("-exec-continue")
+        self.expect("\*stopped,reason=\"breakpoint-hit\"")
+        
+        # Detach
+        self.runCmd("-target-detach")
+        self.expect("\^done")
+        
+    @lldbmi_test
+    @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows")
+    @skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races
+    @skipIfLinux # cannot attach to process on linux
+    def test_lldbmi_target_attach_name(self):
+        """Test that 'lldb-mi --interpreter' works for -target-attach -n <name>."""
+           
+        # Build target executable with unique name
+        exeName = self.testMethodName
+        d = {'EXE': exeName}
+        self.buildProgram("test_attach.cpp", exeName)
+        self.addTearDownCleanup(dictionary=d)
+        
+        # Start target process
+        targetProcess = self.spawnSubprocess(os.path.join(os.path.dirname(__file__), exeName));
+        self.addTearDownHook(self.cleanupSubprocesses)
+        
+        self.spawnLldbMi(args = None)
+        
+        # Set up atatch
+        self.runCmd("-target-attach -n %s" % exeName)
+        self.expect("\^done")
+        
+        # Set breakpoint on printf
+        line = line_number('test_attach.cpp', '// BP_i++')
+        self.runCmd("-break-insert -f test_attach.cpp:%d" % line)
+        self.expect("\^done,bkpt={number=\"1\"")
+        
+        # Continue to breakpoint
+        self.runCmd("-exec-continue")
+        self.expect("\*stopped,reason=\"breakpoint-hit\"")
+        
+        # Detach
+        self.runCmd("-target-detach")
+        self.expect("\^done")
+        
+    @lldbmi_test
+    @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows")
+    @skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races
+    @skipIfLinux # cannot attach to process on linux
+    def test_lldbmi_target_attach_pid(self):
+        """Test that 'lldb-mi --interpreter' works for -target-attach <pid>."""
+           
+        # Build target executable with unique name
+        exeName = self.testMethodName
+        d = {'EXE': exeName}
+        self.buildProgram("test_attach.cpp", exeName)
+        self.addTearDownCleanup(dictionary=d)
+        
+        # Start target process
+        targetProcess = self.spawnSubprocess(os.path.join(os.path.dirname(__file__), exeName));
+        self.addTearDownHook(self.cleanupSubprocesses)
+        
+        self.spawnLldbMi(args = None)
+        
+        # Set up atatch
+        self.runCmd("-target-attach %d" % targetProcess.pid)
+        self.expect("\^done")
+        
+        # Set breakpoint on printf
+        line = line_number('test_attach.cpp', '// BP_i++')
+        self.runCmd("-break-insert -f test_attach.cpp:%d" % line)
+        self.expect("\^done,bkpt={number=\"1\"")
+        
+        # Continue to breakpoint
+        self.runCmd("-exec-continue")
+        self.expect("\*stopped,reason=\"breakpoint-hit\"")
+        
+        # Detach
+        self.runCmd("-target-detach")
+        self.expect("\^done")

Added: lldb/trunk/test/tools/lldb-mi/target/test_attach.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/tools/lldb-mi/target/test_attach.cpp?rev=236705&view=auto
==============================================================================
--- lldb/trunk/test/tools/lldb-mi/target/test_attach.cpp (added)
+++ lldb/trunk/test/tools/lldb-mi/target/test_attach.cpp Thu May  7 02:38:49 2015
@@ -0,0 +1,21 @@
+//===-- main.cpp ------------------------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include <cstdio>
+
+int
+main(int argc, char const *argv[]) 
+{
+    int i = 0;
+    for (;;)
+    {
+        i++; // BP_i++
+    }
+    return 0;
+}

Modified: lldb/trunk/tools/lldb-mi/MICmdCmdTarget.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-mi/MICmdCmdTarget.cpp?rev=236705&r1=236704&r2=236705&view=diff
==============================================================================
--- lldb/trunk/tools/lldb-mi/MICmdCmdTarget.cpp (original)
+++ lldb/trunk/tools/lldb-mi/MICmdCmdTarget.cpp Thu May  7 02:38:49 2015
@@ -22,6 +22,9 @@
 #include "MICmnLLDBDebugger.h"
 #include "MICmnLLDBDebugSessionInfo.h"
 #include "MICmdArgValString.h"
+#include "MICmdArgValOptionLong.h"
+#include "MICmdArgValOptionShort.h"
+#include "MICmdArgValNumber.h"
 
 //++ ------------------------------------------------------------------------------------
 // Details: CMICmdCmdTargetSelect constructor.
@@ -204,3 +207,263 @@ CMICmdCmdTargetSelect::CreateSelf(void)
 {
     return new CMICmdCmdTargetSelect();
 }
+
+//++ ------------------------------------------------------------------------------------
+// Details: CMICmdCmdTargetAttach constructor.
+// Type:    Method.
+// Args:    None.
+// Return:  None.
+// Throws:  None.
+//--
+CMICmdCmdTargetAttach::CMICmdCmdTargetAttach(void)
+: m_constStrArgPid("pid")
+, m_constStrArgNamedFile("n")
+, m_constStrArgWaitFor("waitfor")
+{
+    // Command factory matches this name with that received from the stdin stream
+    m_strMiCmd = "target-attach";
+    
+    // Required by the CMICmdFactory when registering *this command
+    m_pSelfCreatorFn = &CMICmdCmdTargetAttach::CreateSelf;
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: CMICmdCmdTargetAttach destructor.
+// Type:    Overrideable.
+// Args:    None.
+// Return:  None.
+// Throws:  None.
+//--
+CMICmdCmdTargetAttach::~CMICmdCmdTargetAttach(void)
+{
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: The invoker requires this function. The parses the command line options
+//          arguments to extract values for each of those arguments.
+// Type:    Overridden.
+// Args:    None.
+// Return:  MIstatus::success - Functional succeeded.
+//          MIstatus::failure - Functional failed.
+// Throws:  None.
+//--
+bool
+CMICmdCmdTargetAttach::ParseArgs(void)
+{
+    bool bOk = m_setCmdArgs.Add(*(new CMICmdArgValNumber(m_constStrArgPid, false, true)));
+    bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValOptionShort(m_constStrArgNamedFile, false, true,
+                                                              CMICmdArgValListBase::eArgValType_String, 1)));
+    bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValOptionLong(m_constStrArgWaitFor, false, true)));
+    return (bOk && ParseValidateCmdOptions());
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: The invoker requires this function. The command does work in this function.
+//          The command is likely to communicate with the LLDB SBDebugger in here.
+//          Synopsis: -target-attach file
+//          Ref: http://sourceware.org/gdb/onlinedocs/gdb/GDB_002fMI-Target-Manipulation.html#GDB_002fMI-Target-Manipulation
+// Type:    Overridden.
+// Args:    None.
+// Return:  MIstatus::success - Functional succeeded.
+//          MIstatus::failure - Functional failed.
+// Throws:  None.
+//--
+bool
+CMICmdCmdTargetAttach::Execute(void)
+{
+    CMICMDBASE_GETOPTION(pArgPid, Number, m_constStrArgPid);
+    CMICMDBASE_GETOPTION(pArgFile, OptionShort, m_constStrArgNamedFile);
+    CMICMDBASE_GETOPTION(pArgWaitFor, OptionLong, m_constStrArgWaitFor);
+    
+    CMICmnLLDBDebugSessionInfo &rSessionInfo(CMICmnLLDBDebugSessionInfo::Instance());
+    
+    // If the current target is invalid, create one
+    lldb::SBTarget target = rSessionInfo.GetTarget();
+    if (!target.IsValid())
+    {
+        target = rSessionInfo.GetDebugger().CreateTarget(NULL);
+        if (!target.IsValid())
+        {
+            SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_INVALID_TARGET_CURRENT), m_cmdData.strMiCmd.c_str()));
+            return MIstatus::failure;
+        }
+    }
+
+    lldb::SBError error;
+    lldb::SBListener listener;
+    if (pArgPid->GetFound() && pArgPid->GetValid())
+    {
+        lldb::pid_t pid;
+        pid = pArgPid->GetValue();
+        target.AttachToProcessWithID(listener, pid, error);
+    }
+    else if (pArgFile->GetFound() && pArgFile->GetValid())
+    {
+        bool bWaitFor = (pArgWaitFor->GetFound());
+        CMIUtilString file;
+        pArgFile->GetExpectedOption<CMICmdArgValString>(file);
+        target.AttachToProcessWithName(listener, file.c_str(), bWaitFor, error);
+    }
+    else
+    {
+        SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_ATTACH_BAD_ARGS), m_cmdData.strMiCmd.c_str()));
+        return MIstatus::failure;
+    }
+
+    lldb::SBStream errMsg;
+    if (error.Fail())
+    {
+        SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_ATTACH_FAILED), m_cmdData.strMiCmd.c_str(), errMsg.GetData()));
+        return MIstatus::failure;
+    }
+    
+    return MIstatus::success;
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: The invoker requires this function. The command prepares a MI Record Result
+//          for the work carried out in the Execute().
+// Type:    Overridden.
+// Args:    None.
+// Return:  MIstatus::success - Functional succeeded.
+//          MIstatus::failure - Functional failed.
+// Throws:  None.
+//--
+bool
+CMICmdCmdTargetAttach::Acknowledge(void)
+{
+    const CMICmnMIResultRecord miRecordResult(m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done);
+    m_miResultRecord = miRecordResult;
+    
+    CMICmnLLDBDebugSessionInfo &rSessionInfo(CMICmnLLDBDebugSessionInfo::Instance());
+    lldb::pid_t pid = rSessionInfo.GetProcess().GetProcessID();
+    // Prod the client i.e. Eclipse with out-of-band results to help it 'continue' because it is using LLDB debugger
+    // Give the client '=thread-group-started,id="i1"'
+    m_bHasResultRecordExtra = true;
+    const CMICmnMIValueConst miValueConst2("i1");
+    const CMICmnMIValueResult miValueResult2("id", miValueConst2);
+    const CMIUtilString strPid(CMIUtilString::Format("%lld", pid));
+    const CMICmnMIValueConst miValueConst(strPid);
+    const CMICmnMIValueResult miValueResult("pid", miValueConst);
+    CMICmnMIOutOfBandRecord miOutOfBand(CMICmnMIOutOfBandRecord::eOutOfBand_ThreadGroupStarted, miValueResult2);
+    miOutOfBand.Add(miValueResult);
+    m_miResultRecordExtra = miOutOfBand.GetString();
+    
+    return MIstatus::success;
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: Required by the CMICmdFactory when registering *this command. The factory
+//          calls this function to create an instance of *this command.
+// Type:    Static method.
+// Args:    None.
+// Return:  CMICmdBase * - Pointer to a new command.
+// Throws:  None.
+//--
+CMICmdBase *
+CMICmdCmdTargetAttach::CreateSelf(void)
+{
+    return new CMICmdCmdTargetAttach();
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: CMICmdCmdTargetDetach constructor.
+// Type:    Method.
+// Args:    None.
+// Return:  None.
+// Throws:  None.
+//--
+CMICmdCmdTargetDetach::CMICmdCmdTargetDetach()
+{
+    // Command factory matches this name with that received from the stdin stream
+    m_strMiCmd = "target-detach";
+    
+    // Required by the CMICmdFactory when registering *this command
+    m_pSelfCreatorFn = &CMICmdCmdTargetDetach::CreateSelf;
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: CMICmdCmdTargetDetach destructor.
+// Type:    Overrideable.
+// Args:    None.
+// Return:  None.
+// Throws:  None.
+//--
+CMICmdCmdTargetDetach::~CMICmdCmdTargetDetach(void)
+{
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: The invoker requires this function. The parses the command line options
+//          arguments to extract values for each of those arguments.
+// Type:    Overridden.
+// Args:    None.
+// Return:  MIstatus::success - Functional succeeded.
+//          MIstatus::failure - Functional failed.
+// Throws:  None.
+//--
+bool
+CMICmdCmdTargetDetach::ParseArgs(void)
+{
+    return MIstatus::success;
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: The invoker requires this function. The command does work in this function.
+//          The command is likely to communicate with the LLDB SBDebugger in here.
+//          Synopsis: -target-attach file
+//          Ref: http://sourceware.org/gdb/onlinedocs/gdb/GDB_002fMI-Target-Manipulation.html#GDB_002fMI-Target-Manipulation
+// Type:    Overridden.
+// Args:    None.
+// Return:  MIstatus::success - Functional succeeded.
+//          MIstatus::failure - Functional failed.
+// Throws:  None.
+//--
+bool
+CMICmdCmdTargetDetach::Execute(void)
+{
+    CMICmnLLDBDebugSessionInfo &rSessionInfo(CMICmnLLDBDebugSessionInfo::Instance());
+    
+    lldb::SBProcess process = rSessionInfo.GetProcess();
+    
+    if (!process.IsValid())
+    {
+        SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_INVALID_PROCESS), m_cmdData.strMiCmd.c_str()));
+        return MIstatus::failure;
+    }
+    
+    process.Detach();
+    
+    return MIstatus::success;
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: The invoker requires this function. The command prepares a MI Record Result
+//          for the work carried out in the Execute().
+// Type:    Overridden.
+// Args:    None.
+// Return:  MIstatus::success - Functional succeeded.
+//          MIstatus::failure - Functional failed.
+// Throws:  None.
+//--
+bool
+CMICmdCmdTargetDetach::Acknowledge(void)
+{
+    const CMICmnMIResultRecord miRecordResult(m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done);
+    m_miResultRecord = miRecordResult;
+    return MIstatus::success;
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: Required by the CMICmdFactory when registering *this command. The factory
+//          calls this function to create an instance of *this command.
+// Type:    Static method.
+// Args:    None.
+// Return:  CMICmdBase * - Pointer to a new command.
+// Throws:  None.
+//--
+CMICmdBase *
+CMICmdCmdTargetDetach::CreateSelf(void)
+{
+    return new CMICmdCmdTargetDetach();
+}

Modified: lldb/trunk/tools/lldb-mi/MICmdCmdTarget.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-mi/MICmdCmdTarget.h?rev=236705&r1=236704&r2=236705&view=diff
==============================================================================
--- lldb/trunk/tools/lldb-mi/MICmdCmdTarget.h (original)
+++ lldb/trunk/tools/lldb-mi/MICmdCmdTarget.h Thu May  7 02:38:49 2015
@@ -58,3 +58,62 @@ class CMICmdCmdTargetSelect : public CMI
     const CMIUtilString m_constStrArgNamedType;
     const CMIUtilString m_constStrArgNamedParameters;
 };
+
+//++ ============================================================================
+// Details: MI command class. MI commands derived from the command base class.
+//          *this class implements MI command "target-attach".
+//          http://sourceware.org/gdb/onlinedocs/gdb/GDB_002fMI-Target-Manipulation.html#GDB_002fMI-Target-Manipulation
+//--
+class CMICmdCmdTargetAttach : public CMICmdBase
+{
+    // Statics:
+public:
+    // Required by the CMICmdFactory when registering *this command
+    static CMICmdBase *CreateSelf(void);
+    
+    // Methods:
+public:
+    /* ctor */ CMICmdCmdTargetAttach(void);
+    
+    // Overridden:
+public:
+    // From CMICmdInvoker::ICmd
+    virtual bool Execute(void);
+    virtual bool Acknowledge(void);
+    virtual bool ParseArgs(void);
+    // From CMICmnBase
+    /* dtor */ virtual ~CMICmdCmdTargetAttach(void);
+    
+    // Attributes:
+private:
+    const CMIUtilString m_constStrArgPid;
+    const CMIUtilString m_constStrArgNamedFile;
+    const CMIUtilString m_constStrArgWaitFor;
+};
+
+//++ ============================================================================
+// Details: MI command class. MI commands derived from the command base class.
+//          *this class implements MI command "target-attach".
+//          http://sourceware.org/gdb/onlinedocs/gdb/GDB_002fMI-Target-Manipulation.html#GDB_002fMI-Target-Manipulation
+//--
+class CMICmdCmdTargetDetach : public CMICmdBase
+{
+    // Statics:
+public:
+    // Required by the CMICmdFactory when registering *this command
+    static CMICmdBase *CreateSelf(void);
+    
+    // Methods:
+public:
+    /* ctor */ CMICmdCmdTargetDetach(void);
+    
+    // Overridden:
+public:
+    // From CMICmdInvoker::ICmd
+    virtual bool Execute(void);
+    virtual bool Acknowledge(void);
+    virtual bool ParseArgs(void);
+    // From CMICmnBase
+    /* dtor */ virtual ~CMICmdCmdTargetDetach(void);
+};
+

Modified: lldb/trunk/tools/lldb-mi/MICmdCommands.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-mi/MICmdCommands.cpp?rev=236705&r1=236704&r2=236705&view=diff
==============================================================================
--- lldb/trunk/tools/lldb-mi/MICmdCommands.cpp (original)
+++ lldb/trunk/tools/lldb-mi/MICmdCommands.cpp Thu May  7 02:38:49 2015
@@ -121,6 +121,8 @@ MICmnCommands::RegisterAll(void)
     bOk &= Register<CMICmdCmdSupportListFeatures>();
     bOk &= Register<CMICmdCmdSymbolListLines>();
     bOk &= Register<CMICmdCmdTargetSelect>();
+    bOk &= Register<CMICmdCmdTargetAttach>();
+    bOk &= Register<CMICmdCmdTargetDetach>();
     bOk &= Register<CMICmdCmdThreadInfo>();
     bOk &= Register<CMICmdCmdVarAssign>();
     bOk &= Register<CMICmdCmdVarCreate>();

Modified: lldb/trunk/tools/lldb-mi/MICmnResources.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-mi/MICmnResources.cpp?rev=236705&r1=236704&r2=236705&view=diff
==============================================================================
--- lldb/trunk/tools/lldb-mi/MICmnResources.cpp (original)
+++ lldb/trunk/tools/lldb-mi/MICmnResources.cpp Thu May  7 02:38:49 2015
@@ -250,7 +250,9 @@ const CMICmnResources::SRsrcTextData CMI
     {IDS_CMD_ERR_GDBSET_OPT_PRINT_UNKNOWN_OPTION, "'print' error. The option '%s' not found"},
     {IDS_CMD_ERR_GDBSHOW_OPT_PRINT_BAD_ARGS, "'print' expects option-name and \"on\" or \"off\""},
     {IDS_CMD_ERR_GDBSHOW_OPT_PRINT_UNKNOWN_OPTION, "'print' error. The option '%s' not found"},
-    {IDS_CMD_ERR_EXPR_INVALID, "Failed to evaluate expression: %s"}};
+    {IDS_CMD_ERR_EXPR_INVALID, "Failed to evaluate expression: %s"},
+    {IDS_CMD_ERR_ATTACH_FAILED, "Command '%s'. Attach to processs failed: %s"},
+    {IDS_CMD_ERR_ATTACH_BAD_ARGS, "Command '%s'. Must specify either a PID or a Name"}};
 
 //++ ------------------------------------------------------------------------------------
 // Details: CMICmnResources constructor.

Modified: lldb/trunk/tools/lldb-mi/MICmnResources.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-mi/MICmnResources.h?rev=236705&r1=236704&r2=236705&view=diff
==============================================================================
--- lldb/trunk/tools/lldb-mi/MICmnResources.h (original)
+++ lldb/trunk/tools/lldb-mi/MICmnResources.h Thu May  7 02:38:49 2015
@@ -268,7 +268,9 @@ enum
     IDS_CMD_ERR_GDBSET_OPT_PRINT_UNKNOWN_OPTION,
     IDS_CMD_ERR_GDBSHOW_OPT_PRINT_BAD_ARGS,
     IDS_CMD_ERR_GDBSHOW_OPT_PRINT_UNKNOWN_OPTION,
-    IDS_CMD_ERR_EXPR_INVALID
+    IDS_CMD_ERR_EXPR_INVALID,
+    IDS_CMD_ERR_ATTACH_FAILED,
+    IDS_CMD_ERR_ATTACH_BAD_ARGS
 };
 
 //++ ============================================================================

Modified: lldb/trunk/tools/lldb-mi/MIExtensions.txt
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-mi/MIExtensions.txt?rev=236705&r1=236704&r2=236705&view=diff
==============================================================================
--- lldb/trunk/tools/lldb-mi/MIExtensions.txt (original)
+++ lldb/trunk/tools/lldb-mi/MIExtensions.txt Thu May  7 02:38:49 2015
@@ -91,3 +91,13 @@ The =library-loaded notification has 3 e
 For example:
     =library-loaded,id="/Users/IliaK/p/hello",target-name="/Users/IliaK/p/hello",host-name="/Users/IliaK/p/hello",symbols-loaded="1",symbols-path="/Users/IliaK/p/hello.dSYM/Contents/Resources/DWARF/hello",loaded_addr="-"
     =library-loaded,id="/usr/lib/dyld",target-name="/usr/lib/dyld",host-name="/usr/lib/dyld",symbols-loaded="0",loaded_addr="0x00007fff5fc00000"
+
+# -target-attach
+
+Synopsis
+
+Additional syntax provided by lldb-mi:
+	-target-attach -n <executable-name> [--waitfor]
+
+Attach to an executable. Using -n allows specifying an executable name to attach to. 
+Using this with --watifor can do a deffered attach. The flags -n and --waitfor match the syntax of lldb proper's 'process attach' command.





More information about the lldb-commits mailing list