[lldb-mi] Implement -gdb-set breakpoint pending on/off
Summary: This allows creating pending breakpoint automatically when a location is not found. This is used by some front-ends instead of doing "-break-insert -f" every time. See also https://sourceware.org/gdb/onlinedocs/gdb/Set-Breaks.html Signed-off-by: Marc-Andre Laperle <malaperle@gmail.com> Subscribers: MaskRay, llvm-commits, lldb-commits, ki.stfu Tags: #lldb Differential Revision: https://reviews.llvm.org/D52953 llvm-svn: 345563
This commit is contained in:
parent
d2e69dfddb
commit
d8e14a5901
|
@ -0,0 +1,47 @@
|
||||||
|
# XFAIL: windows
|
||||||
|
# -> llvm.org/pr24452
|
||||||
|
#
|
||||||
|
# RUN: %cc -o %t %p/inputs/break-insert-pending.c -g
|
||||||
|
# RUN: %lldbmi %t < %s | FileCheck %s
|
||||||
|
|
||||||
|
# Test for enabling pending breakpoints globally
|
||||||
|
|
||||||
|
-break-insert printf
|
||||||
|
# CHECK: ^error,msg="Command 'break-insert'. Breakpoint location 'printf' not found
|
||||||
|
|
||||||
|
-gdb-set breakpoint pending on
|
||||||
|
# CHECK: ^done
|
||||||
|
-gdb-show breakpoint pending
|
||||||
|
# CHECK: ^done,value="on"
|
||||||
|
-break-insert printf
|
||||||
|
# CHECK: ^done,bkpt={number="2",type="breakpoint",disp="keep",enabled="y",addr="0xffffffffffffffff",func="??",file="??",fullname="??/??",line="0",pending=["printf"],times="0",original-location="printf"}
|
||||||
|
|
||||||
|
-exec-run
|
||||||
|
# CHECK: ^running
|
||||||
|
# CHECK: *stopped,reason="breakpoint-hit",disp="del",bkptno="2",frame={level="0",addr="{{0x[0-9a-f]*[^f][0-9a-f]*}}"
|
||||||
|
-break-disable 2
|
||||||
|
# CHECK: ^done
|
||||||
|
-exec-continue
|
||||||
|
# CHECK: ^running
|
||||||
|
# CHECK: *stopped,reason="exited-normally"
|
||||||
|
|
||||||
|
# Test that it can be turned back off
|
||||||
|
-gdb-show breakpoint pending
|
||||||
|
# CHECK: ^done,value="on"
|
||||||
|
-gdb-set breakpoint pending off
|
||||||
|
# CHECK: ^done
|
||||||
|
-gdb-show breakpoint pending
|
||||||
|
# CHECK: ^done,value="off"
|
||||||
|
-break-insert printf-non-existent
|
||||||
|
# CHECK: ^error,msg="Command 'break-insert'. Breakpoint location 'printf-non-existent' not found"
|
||||||
|
# Check that enable/disable with 1 and 0 works
|
||||||
|
-gdb-set breakpoint pending 1
|
||||||
|
# CHECK: ^done
|
||||||
|
-gdb-show breakpoint pending
|
||||||
|
# CHECK: ^done,value="on"
|
||||||
|
-gdb-set breakpoint pending 0
|
||||||
|
# CHECK: ^done
|
||||||
|
-gdb-show breakpoint pending
|
||||||
|
# CHECK: ^done,value="off"
|
||||||
|
-gdb-set breakpoint pending garbage
|
||||||
|
# CHECK: ^done
|
|
@ -0,0 +1,6 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int main(int argc, char const *argv[]) {
|
||||||
|
printf("Print a formatted string so that GCC does not optimize this printf call: %s\n", argv[0]);
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -165,8 +165,15 @@ bool CMICmdCmdBreakInsert::Execute() {
|
||||||
|
|
||||||
if (sbTarget == rSessionInfo.GetDebugger().GetDummyTarget())
|
if (sbTarget == rSessionInfo.GetDebugger().GetDummyTarget())
|
||||||
m_bBrkPtIsPending = true;
|
m_bBrkPtIsPending = true;
|
||||||
else
|
else {
|
||||||
m_bBrkPtIsPending = pArgPendingBrkPt->GetFound();
|
m_bBrkPtIsPending = pArgPendingBrkPt->GetFound();
|
||||||
|
if (!m_bBrkPtIsPending) {
|
||||||
|
CMIUtilString pending;
|
||||||
|
if (m_rLLDBDebugSessionInfo.SharedDataRetrieve("breakpoint.pending", pending)) {
|
||||||
|
m_bBrkPtIsPending = pending == "on";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (pArgLocation->GetFound())
|
if (pArgLocation->GetFound())
|
||||||
m_brkName = pArgLocation->GetValue();
|
m_brkName = pArgLocation->GetValue();
|
||||||
|
|
|
@ -28,7 +28,8 @@ const CMICmdCmdGdbSet::MapGdbOptionNameToFnGdbOptionPtr_t
|
||||||
{"output-radix", &CMICmdCmdGdbSet::OptionFnOutputRadix},
|
{"output-radix", &CMICmdCmdGdbSet::OptionFnOutputRadix},
|
||||||
{"solib-search-path", &CMICmdCmdGdbSet::OptionFnSolibSearchPath},
|
{"solib-search-path", &CMICmdCmdGdbSet::OptionFnSolibSearchPath},
|
||||||
{"disassembly-flavor", &CMICmdCmdGdbSet::OptionFnDisassemblyFlavor},
|
{"disassembly-flavor", &CMICmdCmdGdbSet::OptionFnDisassemblyFlavor},
|
||||||
{"fallback", &CMICmdCmdGdbSet::OptionFnFallback}};
|
{"fallback", &CMICmdCmdGdbSet::OptionFnFallback},
|
||||||
|
{"breakpoint", &CMICmdCmdGdbSet::OptionFnBreakpoint}};
|
||||||
|
|
||||||
//++
|
//++
|
||||||
//------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------
|
||||||
|
@ -431,6 +432,56 @@ bool CMICmdCmdGdbSet::OptionFnDisassemblyFlavor(
|
||||||
return MIstatus::success;
|
return MIstatus::success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//++
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
// Details: Carry out work to complete the GDB set option 'breakpoint' to
|
||||||
|
// prepare
|
||||||
|
// and send back information asked for.
|
||||||
|
// 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 CMICmdCmdGdbSet::OptionFnBreakpoint(
|
||||||
|
const CMIUtilString::VecString_t &vrWords) {
|
||||||
|
bool bPending = false;
|
||||||
|
bool bOk = true;
|
||||||
|
|
||||||
|
if (vrWords.size() != 2)
|
||||||
|
// Wrong number of arguments.
|
||||||
|
bOk = false;
|
||||||
|
else if (CMIUtilString::Compare(vrWords[0], "pending") &&
|
||||||
|
(CMIUtilString::Compare(vrWords[1], "on") ||
|
||||||
|
CMIUtilString::Compare(vrWords[1], "1")))
|
||||||
|
bPending = true;
|
||||||
|
else if (CMIUtilString::Compare(vrWords[0], "pending") &&
|
||||||
|
(CMIUtilString::Compare(vrWords[1], "off") ||
|
||||||
|
CMIUtilString::Compare(vrWords[1], "0")))
|
||||||
|
bPending = false;
|
||||||
|
else
|
||||||
|
// Unrecognized argument(s).
|
||||||
|
bOk = false;
|
||||||
|
|
||||||
|
if (!bOk) {
|
||||||
|
// Report error.
|
||||||
|
m_bGbbOptionFnHasError = false;
|
||||||
|
SetError(MIRSRC(IDS_CMD_ERR_GDBSET_OPT_BREAKPOINT));
|
||||||
|
return MIstatus::failure;
|
||||||
|
}
|
||||||
|
|
||||||
|
CMIUtilString sPendingVal = bPending ? "on" : "off";
|
||||||
|
CMIUtilString sKey = "breakpoint.pending";
|
||||||
|
if (!m_rLLDBDebugSessionInfo.SharedDataAdd(sKey, sPendingVal)) {
|
||||||
|
m_bGbbOptionFnHasError = false;
|
||||||
|
SetError(CMIUtilString::Format(MIRSRC(IDS_DBGSESSION_ERR_SHARED_DATA_ADD),
|
||||||
|
m_cmdData.strMiCmd.c_str(), sKey.c_str()));
|
||||||
|
return MIstatus::failure;
|
||||||
|
}
|
||||||
|
|
||||||
|
return MIstatus::success;
|
||||||
|
}
|
||||||
|
|
||||||
//++
|
//++
|
||||||
//------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------
|
||||||
// Details: Carry out work to complete the GDB set option to prepare and send
|
// Details: Carry out work to complete the GDB set option to prepare and send
|
||||||
|
|
|
@ -80,6 +80,7 @@ private:
|
||||||
bool OptionFnSolibSearchPath(const CMIUtilString::VecString_t &vrWords);
|
bool OptionFnSolibSearchPath(const CMIUtilString::VecString_t &vrWords);
|
||||||
bool OptionFnOutputRadix(const CMIUtilString::VecString_t &vrWords);
|
bool OptionFnOutputRadix(const CMIUtilString::VecString_t &vrWords);
|
||||||
bool OptionFnDisassemblyFlavor(const CMIUtilString::VecString_t &vrWords);
|
bool OptionFnDisassemblyFlavor(const CMIUtilString::VecString_t &vrWords);
|
||||||
|
bool OptionFnBreakpoint(const CMIUtilString::VecString_t &vrWords);
|
||||||
bool OptionFnFallback(const CMIUtilString::VecString_t &vrWords);
|
bool OptionFnFallback(const CMIUtilString::VecString_t &vrWords);
|
||||||
|
|
||||||
// Attributes:
|
// Attributes:
|
||||||
|
|
|
@ -32,7 +32,8 @@ const CMICmdCmdGdbShow::MapGdbOptionNameToFnGdbOptionPtr_t
|
||||||
{"print", &CMICmdCmdGdbShow::OptionFnPrint},
|
{"print", &CMICmdCmdGdbShow::OptionFnPrint},
|
||||||
{"language", &CMICmdCmdGdbShow::OptionFnLanguage},
|
{"language", &CMICmdCmdGdbShow::OptionFnLanguage},
|
||||||
{"disassembly-flavor", &CMICmdCmdGdbShow::OptionFnDisassemblyFlavor},
|
{"disassembly-flavor", &CMICmdCmdGdbShow::OptionFnDisassemblyFlavor},
|
||||||
{"fallback", &CMICmdCmdGdbShow::OptionFnFallback}};
|
{"fallback", &CMICmdCmdGdbShow::OptionFnFallback},
|
||||||
|
{"breakpoint", &CMICmdCmdGdbShow::OptionFnBreakpoint}};
|
||||||
|
|
||||||
//++
|
//++
|
||||||
//------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------
|
||||||
|
@ -347,6 +348,43 @@ bool CMICmdCmdGdbShow::OptionFnDisassemblyFlavor(const CMIUtilString::VecString_
|
||||||
return MIstatus::success;
|
return MIstatus::success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//++
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
// Details: Carry out work to complete the GDB show option 'breakpoint' 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::OptionFnBreakpoint(
|
||||||
|
const CMIUtilString::VecString_t &vrWords) {
|
||||||
|
if (vrWords.size() != 1) {
|
||||||
|
m_bGbbOptionFnHasError = true;
|
||||||
|
m_strGdbOptionFnError = MIRSRC(IDS_CMD_ERR_GDBSHOW_OPT_BREAKPOINT_BAD_ARGS);
|
||||||
|
return MIstatus::failure;
|
||||||
|
}
|
||||||
|
|
||||||
|
const CMIUtilString strOption(vrWords[0]);
|
||||||
|
if (!CMIUtilString::Compare(strOption, "pending")) {
|
||||||
|
m_bGbbOptionFnHasError = true;
|
||||||
|
m_strGdbOptionFnError = CMIUtilString::Format(
|
||||||
|
MIRSRC(IDS_CMD_ERR_GDBSHOW_OPT_BREAKPOINT_UNKNOWN_OPTION),
|
||||||
|
strOption.c_str());
|
||||||
|
return MIstatus::failure;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!m_rLLDBDebugSessionInfo.SharedDataRetrieve("breakpoint.pending",
|
||||||
|
m_strValue)) {
|
||||||
|
if (m_strValue.empty())
|
||||||
|
m_strValue = "off";
|
||||||
|
}
|
||||||
|
|
||||||
|
return MIstatus::success;
|
||||||
|
}
|
||||||
|
|
||||||
//++
|
//++
|
||||||
//------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------
|
||||||
// Details: Carry out work to complete the GDB show option to prepare and send
|
// Details: Carry out work to complete the GDB show option to prepare and send
|
||||||
|
|
|
@ -80,6 +80,7 @@ private:
|
||||||
bool OptionFnLanguage(const CMIUtilString::VecString_t &vrWords);
|
bool OptionFnLanguage(const CMIUtilString::VecString_t &vrWords);
|
||||||
bool OptionFnDisassemblyFlavor(const CMIUtilString::VecString_t &vrWords);
|
bool OptionFnDisassemblyFlavor(const CMIUtilString::VecString_t &vrWords);
|
||||||
bool OptionFnFallback(const CMIUtilString::VecString_t &vrWords);
|
bool OptionFnFallback(const CMIUtilString::VecString_t &vrWords);
|
||||||
|
bool OptionFnBreakpoint(const CMIUtilString::VecString_t &vrWords);
|
||||||
|
|
||||||
// Attributes:
|
// Attributes:
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -439,6 +439,8 @@ const CMICmnResources::SRsrcTextData
|
||||||
{IDS_CMD_ERR_INFO_PRINTFN_FAILED, "The request '%s' failed."},
|
{IDS_CMD_ERR_INFO_PRINTFN_FAILED, "The request '%s' failed."},
|
||||||
{IDS_CMD_ERR_GDBSET_OPT_TARGETASYNC,
|
{IDS_CMD_ERR_GDBSET_OPT_TARGETASYNC,
|
||||||
"'target-async' expects \"on\" or \"off\""},
|
"'target-async' expects \"on\" or \"off\""},
|
||||||
|
{IDS_CMD_ERR_GDBSET_OPT_BREAKPOINT,
|
||||||
|
"'breakpoint' expects \"pending on\" or \"pending off\""},
|
||||||
{IDS_CMD_ERR_GDBSET_OPT_SOLIBSEARCHPATH,
|
{IDS_CMD_ERR_GDBSET_OPT_SOLIBSEARCHPATH,
|
||||||
"'solib-search-path' requires at least one argument"},
|
"'solib-search-path' requires at least one argument"},
|
||||||
{IDS_CMD_ERR_GDBSET_OPT_PRINT_BAD_ARGS,
|
{IDS_CMD_ERR_GDBSET_OPT_PRINT_BAD_ARGS,
|
||||||
|
@ -449,6 +451,10 @@ const CMICmnResources::SRsrcTextData
|
||||||
"'print' expects option-name and \"on\" or \"off\""},
|
"'print' expects option-name and \"on\" or \"off\""},
|
||||||
{IDS_CMD_ERR_GDBSHOW_OPT_PRINT_UNKNOWN_OPTION,
|
{IDS_CMD_ERR_GDBSHOW_OPT_PRINT_UNKNOWN_OPTION,
|
||||||
"'print' error. The option '%s' not found"},
|
"'print' error. The option '%s' not found"},
|
||||||
|
{IDS_CMD_ERR_GDBSHOW_OPT_BREAKPOINT_BAD_ARGS,
|
||||||
|
"'breakpoint' expects option-name"},
|
||||||
|
{IDS_CMD_ERR_GDBSHOW_OPT_BREAKPOINT_UNKNOWN_OPTION,
|
||||||
|
"'breakpoint' 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,
|
{IDS_CMD_ERR_ATTACH_FAILED,
|
||||||
"Command '%s'. Attach to process failed: %s"},
|
"Command '%s'. Attach to process failed: %s"},
|
||||||
|
|
|
@ -264,11 +264,14 @@ enum {
|
||||||
IDS_CMD_ERR_INFO_PRINTFN_NOT_FOUND,
|
IDS_CMD_ERR_INFO_PRINTFN_NOT_FOUND,
|
||||||
IDS_CMD_ERR_INFO_PRINTFN_FAILED,
|
IDS_CMD_ERR_INFO_PRINTFN_FAILED,
|
||||||
IDS_CMD_ERR_GDBSET_OPT_TARGETASYNC,
|
IDS_CMD_ERR_GDBSET_OPT_TARGETASYNC,
|
||||||
|
IDS_CMD_ERR_GDBSET_OPT_BREAKPOINT,
|
||||||
IDS_CMD_ERR_GDBSET_OPT_SOLIBSEARCHPATH,
|
IDS_CMD_ERR_GDBSET_OPT_SOLIBSEARCHPATH,
|
||||||
IDS_CMD_ERR_GDBSET_OPT_PRINT_BAD_ARGS,
|
IDS_CMD_ERR_GDBSET_OPT_PRINT_BAD_ARGS,
|
||||||
IDS_CMD_ERR_GDBSET_OPT_PRINT_UNKNOWN_OPTION,
|
IDS_CMD_ERR_GDBSET_OPT_PRINT_UNKNOWN_OPTION,
|
||||||
IDS_CMD_ERR_GDBSHOW_OPT_PRINT_BAD_ARGS,
|
IDS_CMD_ERR_GDBSHOW_OPT_PRINT_BAD_ARGS,
|
||||||
IDS_CMD_ERR_GDBSHOW_OPT_PRINT_UNKNOWN_OPTION,
|
IDS_CMD_ERR_GDBSHOW_OPT_PRINT_UNKNOWN_OPTION,
|
||||||
|
IDS_CMD_ERR_GDBSHOW_OPT_BREAKPOINT_BAD_ARGS,
|
||||||
|
IDS_CMD_ERR_GDBSHOW_OPT_BREAKPOINT_UNKNOWN_OPTION,
|
||||||
IDS_CMD_ERR_EXPR_INVALID,
|
IDS_CMD_ERR_EXPR_INVALID,
|
||||||
IDS_CMD_ERR_ATTACH_FAILED,
|
IDS_CMD_ERR_ATTACH_FAILED,
|
||||||
IDS_CMD_ERR_ATTACH_BAD_ARGS
|
IDS_CMD_ERR_ATTACH_BAD_ARGS
|
||||||
|
|
Loading…
Reference in New Issue