diff --git a/share/qtcreator/debugger/lldbbridge.py b/share/qtcreator/debugger/lldbbridge.py index 6fd697fcc3b1b2e9e3a9bf27d19b75def210b739..506f2379a80f27312775572d0baec986f0d6ebdf 100644 --- a/share/qtcreator/debugger/lldbbridge.py +++ b/share/qtcreator/debugger/lldbbridge.py @@ -160,6 +160,7 @@ lldb.SBType.__str__ = lldb.SBType.GetName class Dumper(DumperBase): def __init__(self): DumperBase.__init__(self) + lldb.theDumper = self self.outputLock = threading.Lock() self.debugger = lldb.SBDebugger.Create() @@ -1489,6 +1490,21 @@ class Dumper(DumperBase): bp.SetIgnoreCount(int(args["ignorecount"])) bp.SetCondition(self.hexdecode(args["condition"])) bp.SetEnabled(bool(args["enabled"])) + bp.SetScriptCallbackBody('\n'.join([ + "def foo(frame = frame, bp_loc = bp_loc, dict = internal_dict):", + " " + self.hexdecode(args["command"]).replace('\n', '\n '), + "from cStringIO import StringIO", + "origout = sys.stdout", + "sys.stdout = StringIO()", + "result = foo()", + "d = lldb.theDumper", + "output = d.hexencode(sys.stdout.getvalue())", + "sys.stdout = origout", + "d.report('output={channel=\"stderr\",data=\"' + output + '\"}')", + "if result is False:", + " d.reportState('continueafternextstop')", + "return True" + ])) if isinstance(bp, lldb.SBBreakpoint): bp.SetOneShot(bool(args["oneshot"])) self.reportResult(self.describeBreakpoint(bp) + extra, args) diff --git a/src/plugins/debugger/breakhandler.cpp b/src/plugins/debugger/breakhandler.cpp index f49bbf688126f8fa296788f1d65acc8bb763fedb..207cddbf27f3ad5a738584e5932e43fe7b917e66 100644 --- a/src/plugins/debugger/breakhandler.cpp +++ b/src/plugins/debugger/breakhandler.cpp @@ -733,6 +733,7 @@ PROPERTY(QString, functionName, setFunctionName) PROPERTY(BreakpointType, type, setType) PROPERTY(int, threadSpec, setThreadSpec) PROPERTY(QByteArray, condition, setCondition) +PROPERTY(QString, command, setCommand) PROPERTY(quint64, address, setAddress) PROPERTY(QString, expression, setExpression) PROPERTY(QString, message, setMessage) @@ -757,6 +758,7 @@ void Breakpoint::addToCommand(DebuggerCommand *cmd) const cmd->arg("type", type()); cmd->arg("ignorecount", ignoreCount()); cmd->arg("condition", condition().toHex()); + cmd->arg("command", command().toUtf8().toHex()); cmd->arg("function", functionName().toUtf8()); cmd->arg("oneshot", isOneShot()); cmd->arg("enabled", isEnabled()); diff --git a/src/plugins/debugger/breakhandler.h b/src/plugins/debugger/breakhandler.h index 763db17ce581b8ee2e515c73f5a9463eba22b0a4..150cfd43753a57508bba707a6b230fed66f1df87 100644 --- a/src/plugins/debugger/breakhandler.h +++ b/src/plugins/debugger/breakhandler.h @@ -113,6 +113,8 @@ public: QString expression() const; void setExpression(const QString &expression); QString message() const; + QString command() const; + void setCommand(const QString &command); void setMessage(const QString &m); BreakpointType type() const; void setType(const BreakpointType &type); diff --git a/src/plugins/debugger/lldb/lldbengine.cpp b/src/plugins/debugger/lldb/lldbengine.cpp index 196972a0138ff5f3b2c0dce9a8d16e3fefab9607..03c627e14db4a4b32365b8db2429e8d22b5bec03 100644 --- a/src/plugins/debugger/lldb/lldbengine.cpp +++ b/src/plugins/debugger/lldb/lldbengine.cpp @@ -895,6 +895,8 @@ void LldbEngine::handleStateNotification(const GdbMi &reportedState) notifyInferiorRunOk(); else if (newState == "inferiorrunfailed") notifyInferiorRunFailed(); + else if (newState == "continueafternextstop") + m_continueAtNextSpontaneousStop = true; else if (newState == "stopped") { notifyInferiorSpontaneousStop(); if (m_continueAtNextSpontaneousStop) {