Fix debugger to correctly interpret stdout availability behavior

Previously if program execution was paused, and a c++ command was
executed via executeDebuggerCommand method, which in turn printed
to stdout, Qt Creator would assume that program execution has
been resumed. But in reality the execution was still paused.
Make sure not to report the program execution as being resumed, in
case if something is printed to stdout as a result of a debugger
command.

Change-Id: I8752be00b1bf5bd4767debc2eb26b9a433f251bb
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Alexandru Croitor
2016-08-02 14:50:54 +02:00
parent 54b2599632
commit 3b35d39910

View File

@@ -231,6 +231,7 @@ class Dumper(DumperBase):
self.report('lldbversion=\"%s\"' % lldb.SBDebugger.GetVersionString())
self.reportState("enginesetupok")
self.debuggerCommandInProgress = False
def enterSubItem(self, item):
if isinstance(item.name, lldb.SBValue):
@@ -1335,9 +1336,11 @@ class Dumper(DumperBase):
flavor = event.GetDataFlavor()
state = lldb.SBProcess.GetStateFromEvent(event)
bp = lldb.SBBreakpoint.GetBreakpointFromEvent(event)
skipEventReporting = self.debuggerCommandInProgress and (eventType == lldb.SBProcess.eBroadcastBitSTDOUT or eventType == lldb.SBProcess.eBroadcastBitSTDERR)
self.report('event={type="%s",data="%s",msg="%s",flavor="%s",state="%s",bp="%s"}'
% (eventType, out.GetData(), msg, flavor, self.stateName(state), bp))
if state != self.eventState:
if not skipEventReporting:
self.eventState = state
if state == lldb.eStateExited:
if self.isShuttingDown_:
@@ -1381,6 +1384,7 @@ class Dumper(DumperBase):
else:
self.reportState("stopped")
else:
if not skipEventReporting:
self.reportState(self.stateName(state))
if eventType == lldb.SBProcess.eBroadcastBitStateChanged: # 1
state = self.process.GetState()
@@ -1683,6 +1687,7 @@ class Dumper(DumperBase):
self.reportResult(self.hexencode(result.GetOutput()), {})
def executeDebuggerCommand(self, args):
self.debuggerCommandInProgress = True
self.reportToken(args)
result = lldb.SBCommandReturnObject()
command = args['command']
@@ -1691,6 +1696,7 @@ class Dumper(DumperBase):
output = result.GetOutput()
error = str(result.GetError())
self.report('success="%d",output="%s",error="%s"' % (success, output, error))
self.debuggerCommandInProgress = False
def fetchDisassembler(self, args):
functionName = args.get('function', '')