[Lldb-commits] [lldb] r233114 - Add -gdb-show and target-async option in -gdb-show command (MI)
Ilia K
ki.stfu at gmail.com
Tue Mar 24 14:15:42 PDT 2015
Author: ki.stfu
Date: Tue Mar 24 16:15:42 2015
New Revision: 233114
URL: http://llvm.org/viewvc/llvm-project?rev=233114&view=rev
Log:
Add -gdb-show and target-async option in -gdb-show command (MI)
Summary:
This path adds -gdb-show command with 1 option: target-async.
Also it adds tests for -gdb-set and -gdb-show commands.
All tests pass on OS X.
Test Plan: ./dotest.py -v --executable $BUILDDIR/bin/lldb -f MiGdbSetShowTestCase
Reviewers: clayborg, abidh
Reviewed By: clayborg, abidh
Subscribers: lldb-commits, clayborg, abidh
Differential Revision: http://reviews.llvm.org/D8566
Added:
lldb/trunk/test/tools/lldb-mi/TestMiGdbSetShow.py
lldb/trunk/tools/lldb-mi/MICmdCmdGdbShow.cpp
lldb/trunk/tools/lldb-mi/MICmdCmdGdbShow.h
Modified:
lldb/trunk/tools/lldb-mi/CMakeLists.txt
lldb/trunk/tools/lldb-mi/MICmdCmdGdbSet.cpp
lldb/trunk/tools/lldb-mi/MICmdCommands.cpp
Added: lldb/trunk/test/tools/lldb-mi/TestMiGdbSetShow.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/tools/lldb-mi/TestMiGdbSetShow.py?rev=233114&view=auto
==============================================================================
--- lldb/trunk/test/tools/lldb-mi/TestMiGdbSetShow.py (added)
+++ lldb/trunk/test/tools/lldb-mi/TestMiGdbSetShow.py Tue Mar 24 16:15:42 2015
@@ -0,0 +1,121 @@
+"""
+Test lldb-mi -gdb-set and -gdb-show commands.
+"""
+
+import lldbmi_testcase
+from lldbtest import *
+import unittest2
+
+class MiGdbSetShowTestCase(lldbmi_testcase.MiTestCaseBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ @lldbmi_test
+ @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows")
+ def test_lldbmi_gdb_set_target_async_default(self):
+ """Test that 'lldb-mi --interpreter' switches to async mode by default."""
+
+ self.spawnLldbMi(args = None)
+
+ # Switch to sync mode
+ self.runCmd("-gdb-set target-async off")
+ self.expect("\^done")
+ self.runCmd("-gdb-show target-async")
+ self.expect("\^done,value=\"off\"")
+
+ # Test that -gdb-set switches to async by default
+ self.runCmd("-gdb-set target-async")
+ self.expect("\^done")
+ self.runCmd("-gdb-show target-async")
+ self.expect("\^done,value=\"on\"")
+
+ @lldbmi_test
+ @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows")
+ def test_lldbmi_gdb_set_target_async_on(self):
+ """Test that 'lldb-mi --interpreter' can execute commands in async mode."""
+
+ self.spawnLldbMi(args = None)
+
+ # Switch to sync mode
+ self.runCmd("-gdb-set target-async off")
+ self.expect("\^done")
+ self.runCmd("-gdb-show target-async")
+ self.expect("\^done,value=\"off\"")
+
+ # Test that -gdb-set can switch to async mode
+ self.runCmd("-gdb-set target-async on")
+ self.expect("\^done")
+ self.runCmd("-gdb-show target-async")
+ self.expect("\^done,value=\"on\"")
+
+ # Load executable
+ self.runCmd("-file-exec-and-symbols %s" % self.myexe)
+ self.expect("\^done")
+
+ # Test that program is executed in async mode
+ self.runCmd("-exec-run")
+ self.expect("\*running")
+ self.expect("~\"argc=1")
+
+ @lldbmi_test
+ @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows")
+ def test_lldbmi_gdb_set_target_async_off(self):
+ """Test that 'lldb-mi --interpreter' can execute commands in sync mode."""
+
+ self.spawnLldbMi(args = None)
+
+ # Test that -gdb-set can switch to sync mode
+ self.runCmd("-gdb-set target-async off")
+ self.expect("\^done")
+ self.runCmd("-gdb-show target-async")
+ self.expect("\^done,value=\"off\"")
+
+ # Load executable
+ self.runCmd("-file-exec-and-symbols %s" % self.myexe)
+ self.expect("\^done")
+
+ # Test that program is executed in async mode
+ self.runCmd("-exec-run")
+ unexpected = [ "\*running" ] # "\*running" is async notification
+ it = self.expect(unexpected + [ "~\"argc=1\\\\r\\\\n" ])
+ if it < len(unexpected):
+ # generate error if it's not "~\"argc=1\\\\r\\\\n"
+ self.expect("$UNEXPECTED FOUND: %s.^" % unexpected[it], timeout = 0)
+
+ @lldbmi_test
+ @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows")
+ def test_lldbmi_gdb_show_target_async(self):
+ """Test that 'lldb-mi --interpreter' in async mode by default."""
+
+ self.spawnLldbMi(args = None)
+
+ # Test that default target-async value is "on"
+ self.runCmd("-gdb-show target-async")
+ self.expect("\^done,value=\"on\"")
+
+ @lldbmi_test
+ @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows")
+ @unittest2.expectedFailure("-gdb-set ignores unknown properties")
+ def test_lldbmi_gdb_set_unknown(self):
+ """Test that 'lldb-mi --interpreter' fails when setting an unknown property."""
+
+ self.spawnLldbMi(args = None)
+
+ # Test that -gdb-set fails if property is unknown
+ self.runCmd("-gdb-set unknown some_value")
+ self.expect("\^error")
+
+ @lldbmi_test
+ @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows")
+ @unittest2.expectedFailure("-gdb-show ignores unknown properties")
+ def test_lldbmi_gdb_show_unknown(self):
+ """Test that 'lldb-mi --interpreter' fails when showing an unknown property."""
+
+ self.spawnLldbMi(args = None)
+
+ # Test that -gdb-show fails if property is unknown
+ self.runCmd("-gdb-show unknown")
+ self.expect("\^error")
+
+if __name__ == '__main__':
+ unittest2.main()
Modified: lldb/trunk/tools/lldb-mi/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-mi/CMakeLists.txt?rev=233114&r1=233113&r2=233114&view=diff
==============================================================================
--- lldb/trunk/tools/lldb-mi/CMakeLists.txt (original)
+++ lldb/trunk/tools/lldb-mi/CMakeLists.txt Tue Mar 24 16:15:42 2015
@@ -23,6 +23,7 @@ set(LLDB_MI_SOURCES
MICmdCmdFile.cpp
MICmdCmdGdbInfo.cpp
MICmdCmdGdbSet.cpp
+ MICmdCmdGdbShow.cpp
MICmdCmdGdbThread.cpp
MICmdCmdMiscellanous.cpp
MICmdCmdStack.cpp
Modified: lldb/trunk/tools/lldb-mi/MICmdCmdGdbSet.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-mi/MICmdCmdGdbSet.cpp?rev=233114&r1=233113&r2=233114&view=diff
==============================================================================
--- lldb/trunk/tools/lldb-mi/MICmdCmdGdbSet.cpp (original)
+++ lldb/trunk/tools/lldb-mi/MICmdCmdGdbSet.cpp Tue Mar 24 16:15:42 2015
@@ -93,7 +93,8 @@ CMICmdCmdGdbSet::Execute(void)
CMICMDBASE_GETOPTION(pArgGdbOption, ListOfN, m_constStrArgNamedGdbOption);
const CMICmdArgValListBase::VecArgObjPtr_t &rVecWords(pArgGdbOption->GetExpectedOptions());
- // Get the gdb-set option to carry out
+ // Get the gdb-set option to carry out. This option will be used as an action
+ // which should be done. Further arguments will be used as parameters for it.
CMICmdArgValListBase::VecArgObjPtr_t::const_iterator it = rVecWords.begin();
const CMICmdArgValString *pOption = static_cast<const CMICmdArgValString *>(*it);
const CMIUtilString strOption(pOption->GetValue());
Added: lldb/trunk/tools/lldb-mi/MICmdCmdGdbShow.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-mi/MICmdCmdGdbShow.cpp?rev=233114&view=auto
==============================================================================
--- lldb/trunk/tools/lldb-mi/MICmdCmdGdbShow.cpp (added)
+++ lldb/trunk/tools/lldb-mi/MICmdCmdGdbShow.cpp Tue Mar 24 16:15:42 2015
@@ -0,0 +1,260 @@
+//===-- MICmdCmdGdbShow.cpp -------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Overview: CMICmdCmdGdbShow implementation.
+
+// In-house headers:
+#include "MICmdCmdGdbShow.h"
+#include "MICmnMIResultRecord.h"
+#include "MICmnMIValueConst.h"
+#include "MICmdArgValString.h"
+#include "MICmdArgValListOfN.h"
+#include "MICmdArgValOptionLong.h"
+#include "MICmnLLDBDebugSessionInfo.h"
+
+// Instantiations:
+const CMICmdCmdGdbShow::MapGdbOptionNameToFnGdbOptionPtr_t CMICmdCmdGdbShow::ms_mapGdbOptionNameToFnGdbOptionPtr = {
+ {"target-async", &CMICmdCmdGdbShow::OptionFnTargetAsync},
+ {"fallback", &CMICmdCmdGdbShow::OptionFnFallback}};
+
+//++ ------------------------------------------------------------------------------------
+// Details: CMICmdCmdGdbShow constructor.
+// Type: Method.
+// Args: None.
+// Return: None.
+// Throws: None.
+//--
+CMICmdCmdGdbShow::CMICmdCmdGdbShow(void)
+ : m_constStrArgNamedThreadGrp("thread-group")
+ , m_constStrArgNamedGdbOption("option")
+ , m_bGdbOptionRecognised(true)
+ , m_bGdbOptionFnSuccessful(false)
+ , m_bGbbOptionFnHasError(false)
+ , m_strGdbOptionFnError(MIRSRC(IDS_WORD_ERR_MSG_NOT_IMPLEMENTED_BRKTS))
+{
+ // Command factory matches this name with that received from the stdin stream
+ m_strMiCmd = "gdb-show";
+
+ // Required by the CMICmdFactory when registering *this command
+ m_pSelfCreatorFn = &CMICmdCmdGdbShow::CreateSelf;
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: CMICmdCmdGdbShow destructor.
+// Type: Overrideable.
+// Args: None.
+// Return: None.
+// Throws: None.
+//--
+CMICmdCmdGdbShow::~CMICmdCmdGdbShow(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 - Function succeeded.
+// MIstatus::failure - Function failed.
+// Throws: None.
+//--
+bool
+CMICmdCmdGdbShow::ParseArgs(void)
+{
+ bool bOk = m_setCmdArgs.Add(
+ *(new CMICmdArgValOptionLong(m_constStrArgNamedThreadGrp, false, false, CMICmdArgValListBase::eArgValType_ThreadGrp, 1)));
+ bOk = bOk &&
+ m_setCmdArgs.Add(
+ *(new CMICmdArgValListOfN(m_constStrArgNamedGdbOption, true, true, CMICmdArgValListBase::eArgValType_StringAnything)));
+ return (bOk && ParseValidateCmdOptions());
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: The invoker requires this function. The command is executed in this function.
+// Type: Overridden.
+// Args: None.
+// Return: MIstatus::success - Function succeeded.
+// MIstatus::failure - Function failed.
+// Throws: None.
+//--
+bool
+CMICmdCmdGdbShow::Execute(void)
+{
+ CMICMDBASE_GETOPTION(pArgGdbOption, ListOfN, m_constStrArgNamedGdbOption);
+ const CMICmdArgValListBase::VecArgObjPtr_t &rVecWords(pArgGdbOption->GetExpectedOptions());
+
+ // Get the gdb-show option to carry out. This option will be used as an action
+ // which should be done. Further arguments will be used as parameters for it.
+ CMICmdArgValListBase::VecArgObjPtr_t::const_iterator it = rVecWords.begin();
+ const CMICmdArgValString *pOption = static_cast<const CMICmdArgValString *>(*it);
+ const CMIUtilString strOption(pOption->GetValue());
+ ++it;
+
+ // Retrieve the parameter(s) for the option
+ CMIUtilString::VecString_t vecWords;
+ while (it != rVecWords.end())
+ {
+ const CMICmdArgValString *pWord = static_cast<const CMICmdArgValString *>(*it);
+ vecWords.push_back(pWord->GetValue());
+
+ // Next
+ ++it;
+ }
+
+ FnGdbOptionPtr pPrintRequestFn = nullptr;
+ if (!GetOptionFn(strOption, pPrintRequestFn))
+ {
+ // For unimplemented option handlers, fallback to a generic handler
+ // ToDo: Remove this when ALL options have been implemented
+ if (!GetOptionFn("fallback", pPrintRequestFn))
+ {
+ m_bGdbOptionRecognised = false;
+ m_strGdbOptionName = "fallback"; // This would be the strOption name
+ return MIstatus::success;
+ }
+ }
+
+ m_bGdbOptionFnSuccessful = (this->*(pPrintRequestFn))(vecWords);
+ if (!m_bGdbOptionFnSuccessful && !m_bGbbOptionFnHasError)
+ 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() method.
+// Type: Overridden.
+// Args: None.
+// Return: MIstatus::success - Function succeeded.
+// MIstatus::failure - Function failed.
+// Throws: None.
+//--
+bool
+CMICmdCmdGdbShow::Acknowledge(void)
+{
+ // Print error if option isn't recognized:
+ // ^error,msg="The request '%s' was not recognized, not implemented"
+ if (!m_bGdbOptionRecognised)
+ {
+ const CMICmnMIValueConst miValueConst(
+ CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_INFO_PRINTFN_NOT_FOUND), m_strGdbOptionName.c_str()));
+ const CMICmnMIValueResult miValueResult("msg", miValueConst);
+ const CMICmnMIResultRecord miRecordResult(m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, miValueResult);
+ m_miResultRecord = miRecordResult;
+ return MIstatus::success;
+ }
+
+ // ^done,value="%s"
+ if (m_bGdbOptionFnSuccessful && !m_strValue.empty())
+ {
+ const CMICmnMIValueConst miValueConst(m_strValue);
+ const CMICmnMIValueResult miValueResult("value", miValueConst);
+ const CMICmnMIResultRecord miRecordResult(m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, miValueResult);
+ m_miResultRecord = miRecordResult;
+ return MIstatus::success;
+ }
+ else if (m_bGdbOptionFnSuccessful)
+ {
+ // Ignore empty value (for fallback)
+ const CMICmnMIResultRecord miRecordResult(m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done);
+ m_miResultRecord = miRecordResult;
+ return MIstatus::success;
+ }
+
+ // Print error if request failed:
+ // ^error,msg="The request '%s' failed.
+ const CMICmnMIValueConst miValueConst(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_INFO_PRINTFN_FAILED), m_strGdbOptionFnError.c_str()));
+ 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 *
+CMICmdCmdGdbShow::CreateSelf(void)
+{
+ return new CMICmdCmdGdbShow();
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: Retrieve the print function's pointer for the matching print request.
+// Type: Method.
+// Args: vrPrintFnName - (R) The info requested.
+// vrwpFn - (W) The print function's pointer of the function to carry out
+// Return: bool - True = Print request is implemented, false = not found.
+// Throws: None.
+//--
+bool
+CMICmdCmdGdbShow::GetOptionFn(const CMIUtilString &vrPrintFnName, FnGdbOptionPtr &vrwpFn) const
+{
+ vrwpFn = nullptr;
+
+ const MapGdbOptionNameToFnGdbOptionPtr_t::const_iterator it = ms_mapGdbOptionNameToFnGdbOptionPtr.find(vrPrintFnName);
+ if (it != ms_mapGdbOptionNameToFnGdbOptionPtr.end())
+ {
+ vrwpFn = (*it).second;
+ return true;
+ }
+
+ return false;
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: Carry out work to complete the GDB show option 'target-async' to prepare
+// and send back the requested information.
+// Type: Method.
+// Args: vrWords - (R) List of additional parameters used by this option.
+// Return: MIstatus::success - Function succeeded.
+// MIstatus::failure - Function failed.
+// Throws: None.
+//--
+bool
+CMICmdCmdGdbShow::OptionFnTargetAsync(const CMIUtilString::VecString_t &vrWords)
+{
+ MIunused(vrWords);
+
+ // Get async mode
+ CMICmnLLDBDebugSessionInfo &rSessionInfo(CMICmnLLDBDebugSessionInfo::Instance());
+ const bool bAsyncMode = rSessionInfo.GetDebugger().GetAsync();
+
+ m_strValue = bAsyncMode ? "on" : "off";
+ return MIstatus::success;
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: Carry out work to complete the GDB show option to prepare and send back the
+// requested information.
+// Type: Method.
+// Args: None.
+// Return: MIstatus::success - Function succeeded.
+// MIstatus::failure - Function failed.
+// Throws: None.
+//--
+bool
+CMICmdCmdGdbShow::OptionFnFallback(const CMIUtilString::VecString_t &vrWords)
+{
+ MIunused(vrWords);
+
+ // Do nothing - intentional. This is a fallback function to do nothing.
+ // This allows the search for gdb-show options to always succeed when the option is not
+ // found (implemented).
+
+ return MIstatus::success;
+}
Added: lldb/trunk/tools/lldb-mi/MICmdCmdGdbShow.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-mi/MICmdCmdGdbShow.h?rev=233114&view=auto
==============================================================================
--- lldb/trunk/tools/lldb-mi/MICmdCmdGdbShow.h (added)
+++ lldb/trunk/tools/lldb-mi/MICmdCmdGdbShow.h Tue Mar 24 16:15:42 2015
@@ -0,0 +1,84 @@
+//===-- MICmdCmdGdbShow.h ---------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Overview: CMICmdCmdGdbShow 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
+// to the command factory. The files of relevance are:
+// MICmdCommands.cpp
+// MICmdBase.h / .cpp
+// MICmdCmd.h / .cpp
+// For an introduction to adding a new command see CMICmdCmdSupportInfoMiCmdQuery
+// command class as an example.
+
+#pragma once
+
+// In-house headers:
+#include "MICmdBase.h"
+
+//++ ============================================================================
+// Details: MI command class. MI commands derived from the command base class.
+// *this class implements MI command "gdb-show".
+// This command does not follow the MI documentation exactly. While *this
+// command is implemented it does not do anything with the gdb-set
+// variable past in.
+// The design of matching the info request to a request action (or
+// command) is very simple. The request function which carries out
+// the task of information gathering and printing to stdout is part of
+// *this class. Should the request function become more complicated then
+// that request should really reside in a command type class. Then this
+// class instantiates a request info command for a matching request. The
+// design/code of *this class then does not then become bloated. Use a
+// lightweight version of the current MI command system.
+//--
+class CMICmdCmdGdbShow : public CMICmdBase
+{
+ // Statics:
+ public:
+ // Required by the CMICmdFactory when registering *this command
+ static CMICmdBase *CreateSelf(void);
+
+ // Methods:
+ public:
+ /* ctor */ CMICmdCmdGdbShow(void);
+
+ // Overridden:
+ public:
+ // From CMICmdInvoker::ICmd
+ virtual bool Execute(void);
+ virtual bool Acknowledge(void);
+ virtual bool ParseArgs(void);
+ // From CMICmnBase
+ /* dtor */ virtual ~CMICmdCmdGdbShow(void);
+
+ // Typedefs:
+ private:
+ typedef bool (CMICmdCmdGdbShow::*FnGdbOptionPtr)(const CMIUtilString::VecString_t &vrWords);
+ typedef std::map<CMIUtilString, FnGdbOptionPtr> MapGdbOptionNameToFnGdbOptionPtr_t;
+
+ // Methods:
+ private:
+ bool GetOptionFn(const CMIUtilString &vrGdbOptionName, FnGdbOptionPtr &vrwpFn) const;
+ bool OptionFnTargetAsync(const CMIUtilString::VecString_t &vrWords);
+ bool OptionFnFallback(const CMIUtilString::VecString_t &vrWords);
+
+ // Attributes:
+ private:
+ const static MapGdbOptionNameToFnGdbOptionPtr_t ms_mapGdbOptionNameToFnGdbOptionPtr;
+ //
+ const CMIUtilString m_constStrArgNamedThreadGrp;
+ const CMIUtilString m_constStrArgNamedGdbOption;
+ bool m_bGdbOptionRecognised; // True = This command has a function with a name that matches the Print argument, false = not found
+ bool m_bGdbOptionFnSuccessful; // True = The print function completed its task ok, false = function failed for some reason
+ bool m_bGbbOptionFnHasError; // True = The option function has an error condition (not the command!), false = option function ok.
+ CMIUtilString m_strGdbOptionName;
+ CMIUtilString m_strGdbOptionFnError;
+ CMIUtilString m_strValue;
+};
Modified: lldb/trunk/tools/lldb-mi/MICmdCommands.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-mi/MICmdCommands.cpp?rev=233114&r1=233113&r2=233114&view=diff
==============================================================================
--- lldb/trunk/tools/lldb-mi/MICmdCommands.cpp (original)
+++ lldb/trunk/tools/lldb-mi/MICmdCommands.cpp Tue Mar 24 16:15:42 2015
@@ -27,6 +27,7 @@
#include "MICmdCmdFile.h"
#include "MICmdCmdGdbInfo.h"
#include "MICmdCmdGdbSet.h"
+#include "MICmdCmdGdbShow.h"
#include "MICmdCmdGdbThread.h"
#include "MICmdCmdMiscellanous.h"
#include "MICmdCmdStack.h"
@@ -103,6 +104,7 @@ MICmnCommands::RegisterAll(void)
bOk &= Register<CMICmdCmdGdbExit>();
bOk &= Register<CMICmdCmdGdbInfo>();
bOk &= Register<CMICmdCmdGdbSet>();
+ bOk &= Register<CMICmdCmdGdbShow>();
bOk &= Register<CMICmdCmdGdbThread>();
bOk &= Register<CMICmdCmdInferiorTtySet>();
bOk &= Register<CMICmdCmdInterpreterExec>();
More information about the lldb-commits
mailing list