[Lldb-commits] [lldb] r236208 - Add -data-info-line command (MI)

Ilia K ki.stfu at gmail.com
Thu Apr 30 00:14:24 PDT 2015


Author: ki.stfu
Date: Thu Apr 30 02:14:24 2015
New Revision: 236208

URL: http://llvm.org/viewvc/llvm-project?rev=236208&view=rev
Log:
Add -data-info-line command (MI)

Summary: Add -data-info-line command + test

Test Plan: ./dotest.py -v --executable $BUILDDIR/bin/lldb tools/lldb-mi/

Reviewers: abidh

Reviewed By: abidh

Subscribers: lldb-commits, abidh

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

Modified:
    lldb/trunk/test/tools/lldb-mi/data/TestMiData.py
    lldb/trunk/test/tools/lldb-mi/data/main.cpp
    lldb/trunk/tools/lldb-mi/MICmdCmdData.cpp
    lldb/trunk/tools/lldb-mi/MICmdCmdData.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

Modified: lldb/trunk/test/tools/lldb-mi/data/TestMiData.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/tools/lldb-mi/data/TestMiData.py?rev=236208&r1=236207&r2=236208&view=diff
==============================================================================
--- lldb/trunk/test/tools/lldb-mi/data/TestMiData.py (original)
+++ lldb/trunk/test/tools/lldb-mi/data/TestMiData.py Thu Apr 30 02:14:24 2015
@@ -132,5 +132,52 @@ class MiDataTestCase(lldbmi_testcase.MiT
         self.runCmd("-data-list-register-values x 0")
         self.expect("\^done,register-values=\[{number=\"0\",value=\"0x[0-9a-f]+\"}\]")
 
+    @lldbmi_test
+    @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows")
+    @skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races
+    def test_lldbmi_data_info_line(self):
+        """Test that 'lldb-mi --interpreter' works for -data-info-line."""
+
+        self.spawnLldbMi(args = None)
+
+        # Load executable
+        self.runCmd("-file-exec-and-symbols %s" % self.myexe)
+        self.expect("\^done")
+
+        # Run to main
+        self.runCmd("-break-insert -f main")
+        self.expect("\^done,bkpt={number=\"1\"")
+        self.runCmd("-exec-run")
+        self.expect("\^running")
+        self.expect("\*stopped,reason=\"breakpoint-hit\"")
+
+        # Get the address of main and its line
+        self.runCmd("-data-evaluate-expression main")
+        self.expect("\^done,value=\"0x[0-9a-f]+\"")
+        addr = int(self.child.after.split("\"")[1], 16)
+        line = line_number('main.cpp', '// FUNC_main')
+
+        # Test that -data-info-line works for address
+        self.runCmd("-data-info-line *%#x" % addr)
+        self.expect("\^done,start=\"0x0*%x\",end=\"0x[0-9a-f]+\",file=\".+?main.cpp\",line=\"%d\"" % (addr, line))
+
+        # Test that -data-info-line works for file:line
+        self.runCmd("-data-info-line main.cpp:%d" % line)
+        self.expect("\^done,start=\"0x0*%x\",end=\"0x[0-9a-f]+\",file=\".+?main.cpp\",line=\"%d\"" % (addr, line))
+
+        # Test that -data-info-line fails when invalid address is specified
+        self.runCmd("-data-info-line *0x0")
+        self.expect("\^error,msg=\"Command 'data-info-line'\. Error: The LineEntry is absent or has an unknown format\.\"")
+
+        # Test that -data-info-line fails when file is unknown
+        self.runCmd("-data-info-line unknown_file:1")
+        self.expect("\^error,msg=\"Command 'data-info-line'\. Error: The LineEntry is absent or has an unknown format\.\"")
+
+        # Test that -data-info-line fails when line has invalid format
+        self.runCmd("-data-info-line main.cpp:bad_line")
+        self.expect("\^error,msg=\"error: invalid line number string 'bad_line'")
+        self.runCmd("-data-info-line main.cpp:0")
+        self.expect("\^error,msg=\"error: zero is an invalid line number")
+
 if __name__ == '__main__':
     unittest2.main()

Modified: lldb/trunk/test/tools/lldb-mi/data/main.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/tools/lldb-mi/data/main.cpp?rev=236208&r1=236207&r2=236208&view=diff
==============================================================================
--- lldb/trunk/test/tools/lldb-mi/data/main.cpp (original)
+++ lldb/trunk/test/tools/lldb-mi/data/main.cpp Thu Apr 30 02:14:24 2015
@@ -12,6 +12,6 @@ static const char s_CharArray[] = "\x20\
 
 int
 main(int argc, char const *argv[])
-{
+{ // FUNC_main
     return 0;
 }

Modified: lldb/trunk/tools/lldb-mi/MICmdCmdData.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-mi/MICmdCmdData.cpp?rev=236208&r1=236207&r2=236208&view=diff
==============================================================================
--- lldb/trunk/tools/lldb-mi/MICmdCmdData.cpp (original)
+++ lldb/trunk/tools/lldb-mi/MICmdCmdData.cpp Thu Apr 30 02:14:24 2015
@@ -16,9 +16,11 @@
 //              CMICmdCmdDataListRegisterChanged    implementation.
 //              CMICmdCmdDataWriteMemoryBytes       implementation.
 //              CMICmdCmdDataWriteMemory            implementation.
+//              CMICmdCmdDataInfoLine               implementation.
 
 // Third Party Headers:
 #include <inttypes.h> // For PRIx64
+#include "lldb/API/SBCommandInterpreter.h"
 #include "lldb/API/SBThread.h"
 #include "lldb/API/SBInstruction.h"
 #include "lldb/API/SBInstructionList.h"
@@ -1537,3 +1539,224 @@ CMICmdCmdDataWriteMemory::CreateSelf(voi
 {
     return new CMICmdCmdDataWriteMemory();
 }
+
+//---------------------------------------------------------------------------------------
+//---------------------------------------------------------------------------------------
+//---------------------------------------------------------------------------------------
+
+//++ ------------------------------------------------------------------------------------
+// Details: CMICmdCmdDataInfoLine constructor.
+// Type:    Method.
+// Args:    None.
+// Return:  None.
+// Throws:  None.
+//--
+CMICmdCmdDataInfoLine::CMICmdCmdDataInfoLine(void)
+    : m_constStrArgLocation("location")
+{
+    // Command factory matches this name with that received from the stdin stream
+    m_strMiCmd = "data-info-line";
+
+    // Required by the CMICmdFactory when registering *this command
+    m_pSelfCreatorFn = &CMICmdCmdDataInfoLine::CreateSelf;
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: CMICmdCmdDataInfoLine destructor.
+// Type:    Overrideable.
+// Args:    None.
+// Return:  None.
+// Throws:  None.
+//--
+CMICmdCmdDataInfoLine::~CMICmdCmdDataInfoLine(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
+CMICmdCmdDataInfoLine::ParseArgs(void)
+{
+    bool bOk = m_setCmdArgs.Add(*(new CMICmdArgValString(m_constStrArgLocation, true, 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.
+// Type:    Overridden.
+// Args:    None.
+// Return:  MIstatus::success - Functional succeeded.
+//          MIstatus::failure - Functional failed.
+// Throws:  None.
+//--
+bool
+CMICmdCmdDataInfoLine::Execute(void)
+{
+    CMICMDBASE_GETOPTION(pArgLocation, String, m_constStrArgLocation);
+
+    const CMIUtilString &strLocation(pArgLocation->GetValue());
+    CMIUtilString strCmdOptionsLocation;
+    if (strLocation.at(0) == '*')
+    {
+        // Parse argument:
+        // *0x12345
+        //  ^^^^^^^ -- address
+        const CMIUtilString strAddress(strLocation.c_str() + 1);
+        strCmdOptionsLocation = CMIUtilString::Format("--address %s", strAddress.c_str());
+    }
+    else
+    {
+        const MIuint nLineStartPos = strLocation.rfind(':');
+        if ((nLineStartPos == (MIuint)std::string::npos) || (nLineStartPos == 0) || (nLineStartPos == strLocation.length() - 1))
+        {
+            SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_INVALID_LOCATION_FORMAT), m_cmdData.strMiCmd.c_str(), strLocation.c_str())
+                         .c_str());
+            return MIstatus::failure;
+        }
+        // Parse argument:
+        // hello.cpp:5
+        // ^^^^^^^^^ -- file
+        //           ^ -- line
+        const CMIUtilString strFile(strLocation.substr(0, nLineStartPos).c_str());
+        const CMIUtilString strLine(strLocation.substr(nLineStartPos + 1).c_str());
+        strCmdOptionsLocation = CMIUtilString::Format("--file \"%s\" --line %s", strFile.AddSlashes().c_str(), strLine.c_str());
+    }
+    const CMIUtilString strCmd(CMIUtilString::Format("target modules lookup -v %s", strCmdOptionsLocation.c_str()));
+
+    CMICmnLLDBDebugSessionInfo &rSessionInfo(CMICmnLLDBDebugSessionInfo::Instance());
+    const lldb::ReturnStatus rtn = rSessionInfo.GetDebugger().GetCommandInterpreter().HandleCommand(strCmd.c_str(), m_lldbResult);
+    MIunused(rtn);
+
+    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
+CMICmdCmdDataInfoLine::Acknowledge(void)
+{
+    if (m_lldbResult.GetErrorSize() > 0)
+    {
+        const CMICmnMIValueConst miValueConst(m_lldbResult.GetError());
+        const CMICmnMIValueResult miValueResult("msg", miValueConst);
+        const CMICmnMIResultRecord miRecordResult(m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, miValueResult);
+        m_miResultRecord = miRecordResult;
+        return MIstatus::success;
+    }
+    else if (m_lldbResult.GetOutputSize() > 0)
+    {
+        CMIUtilString::VecString_t vecLines;
+        const CMIUtilString strLldbMsg(m_lldbResult.GetOutput());
+        const MIuint nLines(strLldbMsg.SplitLines(vecLines));
+
+        for (MIuint i = 0; i < nLines; ++i)
+        {
+            // String looks like:
+            // LineEntry: \[0x0000000100000f37-0x0000000100000f45\): /path/to/file:3[:1]
+            const CMIUtilString &rLine(vecLines[i]);
+
+            // LineEntry: \[0x0000000100000f37-0x0000000100000f45\): /path/to/file:3[:1]
+            // ^^^^^^^^^ -- property
+            const MIuint nPropertyStartPos = rLine.find_first_not_of(' ');
+            const MIuint nPropertyEndPos = rLine.find(':');
+            const MIuint nPropertyLen = nPropertyEndPos - nPropertyStartPos;
+            const CMIUtilString strProperty(rLine.substr(nPropertyStartPos, nPropertyLen).c_str());
+
+            // Skip all except LineEntry
+            if (!CMIUtilString::Compare(strProperty, "LineEntry"))
+                continue;
+
+            // LineEntry: \[0x0000000100000f37-0x0000000100000f45\): /path/to/file:3[:1]
+            //              ^^^^^^^^^^^^^^^^^^ -- start address
+            const MIuint nStartAddressStartPos = rLine.find("[");
+            const MIuint nStartAddressEndPos = rLine.find("-");
+            const MIuint nStartAddressLen = nStartAddressEndPos - nStartAddressStartPos - 1;
+            const CMIUtilString strStartAddress(rLine.substr(nStartAddressStartPos + 1, nStartAddressLen).c_str());
+            const CMICmnMIValueConst miValueConst(strStartAddress);
+            const CMICmnMIValueResult miValueResult("start", miValueConst);
+            CMICmnMIResultRecord miRecordResult(m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, miValueResult);
+
+            // LineEntry: \[0x0000000100000f37-0x0000000100000f45\): /path/to/file:3[:1]
+            //                                 ^^^^^^^^^^^^^^^^^^ -- end address
+            const MIuint nEndAddressEndPos = rLine.find(")");
+            const MIuint nEndAddressLen = nEndAddressEndPos - nStartAddressEndPos - 1;
+            const CMIUtilString strEndAddress(rLine.substr(nStartAddressEndPos + 1, nEndAddressLen).c_str());
+            const CMICmnMIValueConst miValueConst2(strEndAddress);
+            const CMICmnMIValueResult miValueResult2("end", miValueConst2);
+            bool bOk = miRecordResult.Add(miValueResult2);
+            if (!bOk)
+                return MIstatus::failure;
+
+            // LineEntry: \[0x0000000100000f37-0x0000000100000f45\): /path/to/file:3[:1]
+            //                                                       ^^^^^^^^^^^^^ -- file
+            //                                                                     ^ -- line
+            //                                                                        ^ -- column (optional)
+            const MIuint nFileStartPos = rLine.find_first_not_of(' ', nEndAddressEndPos + 2);
+            const MIuint nFileOrLineEndPos = rLine.rfind(':');
+            const MIuint nFileOrLineStartPos = rLine.rfind(':', nFileOrLineEndPos - 1);
+            const MIuint nFileEndPos = nFileStartPos < nFileOrLineStartPos ? nFileOrLineStartPos : nFileOrLineEndPos;
+            const MIuint nFileLen = nFileEndPos - nFileStartPos;
+            const CMIUtilString strFile(rLine.substr(nFileStartPos, nFileLen).c_str());
+            const CMICmnMIValueConst miValueConst3(strFile);
+            const CMICmnMIValueResult miValueResult3("file", miValueConst3);
+            bOk = miRecordResult.Add(miValueResult3);
+            if (!bOk)
+                return MIstatus::failure;
+
+            // LineEntry: \[0x0000000100000f37-0x0000000100000f45\): /path/to/file:3[:1]
+            //                                                                     ^ -- line
+            const MIuint nLineStartPos = nFileEndPos + 1;
+            const MIuint nLineEndPos = rLine.find(':', nLineStartPos);
+            const MIuint nLineLen = nLineEndPos != (MIuint)std::string::npos ? nLineEndPos - nLineStartPos - 1
+                                                                             : (MIuint)std::string::npos;
+            const CMIUtilString strLine(rLine.substr(nLineStartPos, nLineLen).c_str());
+            const CMICmnMIValueConst miValueConst4(strLine);
+            const CMICmnMIValueResult miValueResult4("line", miValueConst4);
+            bOk = miRecordResult.Add(miValueResult4);
+            if (!bOk)
+                return MIstatus::failure;
+
+            // MI print "%s^done,start=\"%d\",end=\"%d\"",file=\"%s\",line=\"%d\"
+            m_miResultRecord = miRecordResult;
+
+            return MIstatus::success;
+        }
+    }
+
+    // MI print "%s^error,msg=\"Command '-data-info-line'. Error: The LineEntry is absent or has an unknown format.\""
+    const CMICmnMIValueConst miValueConst(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_SOME_ERROR), m_cmdData.strMiCmd.c_str(), "The LineEntry is absent or has an unknown format."));
+    const CMICmnMIValueResult miValueResult("msg", miValueConst);
+    const CMICmnMIResultRecord miRecordResult(m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, miValueResult);
+    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 *
+CMICmdCmdDataInfoLine::CreateSelf(void)
+{
+    return new CMICmdCmdDataInfoLine();
+}

Modified: lldb/trunk/tools/lldb-mi/MICmdCmdData.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-mi/MICmdCmdData.h?rev=236208&r1=236207&r2=236208&view=diff
==============================================================================
--- lldb/trunk/tools/lldb-mi/MICmdCmdData.h (original)
+++ lldb/trunk/tools/lldb-mi/MICmdCmdData.h Thu Apr 30 02:14:24 2015
@@ -16,6 +16,7 @@
 //              CMICmdCmdDataListRegisterChanged    interface.
 //              CMICmdCmdDataWriteMemoryBytes       interface.
 //              CMICmdCmdDataWriteMemory            interface.
+//              CMICmdCmdDataInfoLine               interface.
 //
 //              To implement new MI commands derive a new command class from the command base
 //              class. To enable the new command for interpretation add the new command class
@@ -29,6 +30,9 @@
 
 #pragma once
 
+// Third party headers:
+#include <lldb/API/SBCommandReturnObject.h>
+
 // In-house headers:
 #include "MICmdBase.h"
 #include "MICmnMIValueTuple.h"
@@ -366,3 +370,34 @@ class CMICmdCmdDataWriteMemory : public
     MIuint64 m_nCount;
     MIuchar *m_pBufferMemory;
 };
+
+//++ ============================================================================
+// Details: MI command class. MI commands derived from the command base class.
+//          *this class implements MI command "data-info-line".
+//          See MIExtensions.txt for details.
+//--
+class CMICmdCmdDataInfoLine : public CMICmdBase
+{
+    // Statics:
+  public:
+    // Required by the CMICmdFactory when registering *this command
+    static CMICmdBase *CreateSelf(void);
+
+    // Methods:
+  public:
+    /* ctor */ CMICmdCmdDataInfoLine(void);
+
+    // Overridden:
+  public:
+    // From CMICmdInvoker::ICmd
+    virtual bool Execute(void);
+    virtual bool Acknowledge(void);
+    virtual bool ParseArgs(void);
+    // From CMICmnBase
+    /* dtor */ virtual ~CMICmdCmdDataInfoLine(void);
+
+    // Attributes:
+  private:
+    lldb::SBCommandReturnObject m_lldbResult;
+    const CMIUtilString m_constStrArgLocation;
+};

Modified: lldb/trunk/tools/lldb-mi/MICmdCommands.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-mi/MICmdCommands.cpp?rev=236208&r1=236207&r2=236208&view=diff
==============================================================================
--- lldb/trunk/tools/lldb-mi/MICmdCommands.cpp (original)
+++ lldb/trunk/tools/lldb-mi/MICmdCommands.cpp Thu Apr 30 02:14:24 2015
@@ -83,6 +83,7 @@ MICmnCommands::RegisterAll(void)
     bOk &= Register<CMICmdCmdBreakInsert>();
     bOk &= Register<CMICmdCmdDataDisassemble>();
     bOk &= Register<CMICmdCmdDataEvaluateExpression>();
+    bOk &= Register<CMICmdCmdDataInfoLine>();
     bOk &= Register<CMICmdCmdDataReadMemoryBytes>();
     bOk &= Register<CMICmdCmdDataReadMemory>();
     bOk &= Register<CMICmdCmdDataListRegisterNames>();

Modified: lldb/trunk/tools/lldb-mi/MICmnResources.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-mi/MICmnResources.cpp?rev=236208&r1=236207&r2=236208&view=diff
==============================================================================
--- lldb/trunk/tools/lldb-mi/MICmnResources.cpp (original)
+++ lldb/trunk/tools/lldb-mi/MICmnResources.cpp Thu Apr 30 02:14:24 2015
@@ -236,6 +236,7 @@ const CMICmnResources::SRsrcTextData CMI
     {IDS_CMD_ERR_LLDB_ERR_READ_MEM_BYTES, "Command '%s'. Unable to read memory block of %u bytes at address 0x%016" PRIx64 ": %s "},
     {IDS_CMD_ERR_INVALID_PROCESS, "Command '%s'. Invalid process during debug session"},
     {IDS_CMD_ERR_INVALID_PRINT_VALUES, "Command '%s'. Unknown value for PRINT_VALUES: must be: 0 or \"--no-values\", 1 or \"--all-values\", 2 or \"--simple-values\""},
+    {IDS_CMD_ERR_INVALID_LOCATION_FORMAT, "Command '%s'. Invalid location format '%s'"},
     {IDS_CMD_ERR_INVALID_FORMAT_TYPE, "Command '%s'. Invalid var format type '%s'"},
     {IDS_CMD_ERR_BRKPT_INFO_OBJ_NOT_FOUND, "Command '%s'. Breakpoint information for breakpoint ID %d not found"},
     {IDS_CMD_ERR_LLDB_ERR_WRITE_MEM_BYTES, "Command '%s'. Unable to write memory block of %u bytes at address 0x%016" PRIx64 ": %s "},

Modified: lldb/trunk/tools/lldb-mi/MICmnResources.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-mi/MICmnResources.h?rev=236208&r1=236207&r2=236208&view=diff
==============================================================================
--- lldb/trunk/tools/lldb-mi/MICmnResources.h (original)
+++ lldb/trunk/tools/lldb-mi/MICmnResources.h Thu Apr 30 02:14:24 2015
@@ -254,6 +254,7 @@ enum
     IDS_CMD_ERR_LLDB_ERR_READ_MEM_BYTES,
     IDS_CMD_ERR_INVALID_PROCESS,
     IDS_CMD_ERR_INVALID_PRINT_VALUES,
+    IDS_CMD_ERR_INVALID_LOCATION_FORMAT,
     IDS_CMD_ERR_INVALID_FORMAT_TYPE,
     IDS_CMD_ERR_BRKPT_INFO_OBJ_NOT_FOUND,
     IDS_CMD_ERR_LLDB_ERR_WRITE_MEM_BYTES,

Modified: lldb/trunk/tools/lldb-mi/MIExtensions.txt
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-mi/MIExtensions.txt?rev=236208&r1=236207&r2=236208&view=diff
==============================================================================
--- lldb/trunk/tools/lldb-mi/MIExtensions.txt (original)
+++ lldb/trunk/tools/lldb-mi/MIExtensions.txt Thu Apr 30 02:14:24 2015
@@ -1,4 +1,4 @@
--file-exec-and-symbols now takes two new (optional) options:
+# -file-exec-and-symbols now takes two new (optional) options:
 
 Synopsis
 
@@ -8,3 +8,26 @@ Specify the executable file to be debugg
 When debugging remote targets specify a remote-file for execution and a file from which symbols are read. 
 The optional platform is the name of the platform, e.g., "remote-ios" or "ios-simulator". The remote-file 
 is the on-device path to the exe.
+
+# -data-info-line
+
+Synopsis
+
+	-data-info-line *<address>
+	-data-info-line <file>:<line>
+
+Provides information about a source line. The input can be <address> like 0x12345678 or <file>:<line>
+where file is a name of source file and line is the line number. As a result the command returns the following
+fields:
+    start - address of the first instruction which refers to that source line
+    end - address of the last instruction which refers to that source line
+    file - the file name
+    line - the line number
+The last two fields are useful in case you have specified a source line using its address.
+
+Example:
+    -data-info-line *0x100000f80
+    ^done,start="0x0000000100000f80",end="0x0000000100000f94",file="/Users/IliaK/p/hello.cpp",line="15"
+
+    -data-info-line hello.cpp:15
+    ^done,start="0x0000000100000f80",end="0x0000000100000f94",file="/Users/IliaK/p/hello.cpp",line="15"





More information about the lldb-commits mailing list