Fix pause/continue of individual threads

work around buggy java server sending invalid threads response.

java server supports this separate threads running/paused as a test
case.
This commit is contained in:
Ben Jackson 2020-11-21 17:41:20 +00:00
commit 8801c2dac4
2 changed files with 36 additions and 23 deletions

View file

@ -434,49 +434,59 @@ class DebugSession( object ):
@IfConnected() @IfConnected()
def StepInto( self ): def StepInto( self ):
if self._stackTraceView.GetCurrentThreadId() is None: threadId = self._stackTraceView.GetCurrentThreadId()
if threadId is None:
return return
self._connection.DoRequest( None, { def handler( *_ ):
self._stackTraceView.OnContinued( { 'threadId': threadId } )
self._codeView.SetCurrentFrame( None )
self._connection.DoRequest( handler, {
'command': 'stepIn', 'command': 'stepIn',
'arguments': { 'arguments': {
'threadId': self._stackTraceView.GetCurrentThreadId() 'threadId': threadId
}, },
} ) } )
self._stackTraceView.OnContinued()
self._codeView.SetCurrentFrame( None )
@IfConnected() @IfConnected()
def StepOut( self ): def StepOut( self ):
if self._stackTraceView.GetCurrentThreadId() is None: threadId = self._stackTraceView.GetCurrentThreadId()
if threadId is None:
return return
self._connection.DoRequest( None, { def handler( *_ ):
self._stackTraceView.OnContinued( { 'threadId': threadId } )
self._codeView.SetCurrentFrame( None )
self._connection.DoRequest( handler, {
'command': 'stepOut', 'command': 'stepOut',
'arguments': { 'arguments': {
'threadId': self._stackTraceView.GetCurrentThreadId() 'threadId': threadId
}, },
} ) } )
self._stackTraceView.OnContinued()
self._codeView.SetCurrentFrame( None )
def Continue( self ): def Continue( self ):
if not self._connection: if not self._connection:
self.Start() self.Start()
return return
if self._stackTraceView.GetCurrentThreadId() is None: threadId = self._stackTraceView.GetCurrentThreadId()
if threadId is None:
utils.UserMessage( 'No current thread', persist = True ) utils.UserMessage( 'No current thread', persist = True )
return return
self._connection.DoRequest( None, { def handler( *_ ):
self._stackTraceView.OnContinued( { 'threadId': threadId } )
self._codeView.SetCurrentFrame( None )
self._connection.DoRequest( handler, {
'command': 'continue', 'command': 'continue',
'arguments': { 'arguments': {
'threadId': self._stackTraceView.GetCurrentThreadId(), 'threadId': threadId,
}, },
} ) } )
self._stackTraceView.OnContinued()
self._codeView.SetCurrentFrame( None )
@IfConnected() @IfConnected()
def Pause( self ): def Pause( self ):

View file

@ -49,6 +49,7 @@ class Thread:
def Continued( self ): def Continued( self ):
self.state = Thread.RUNNING self.state = Thread.RUNNING
self.stopped_event = None self.stopped_event = None
self.Collapse()
def Exited( self ): def Exited( self ):
self.state = Thread.TERMINATED self.state = Thread.TERMINATED
@ -56,7 +57,7 @@ class Thread:
def State( self ): def State( self ):
if self.state == Thread.PAUSED: if self.state == Thread.PAUSED:
return self.stopped_event.get( 'description', 'paused' ) return self.stopped_event.get( 'description' ) or 'paused'
elif self.state == Thread.RUNNING: elif self.state == Thread.RUNNING:
return 'running' return 'running'
return 'terminated' return 'terminated'
@ -191,7 +192,7 @@ class StackTraceView( object ):
self.LoadThreads( *self._pending_thread_request ) self.LoadThreads( *self._pending_thread_request )
return return
if not message[ 'body' ][ 'threads' ]: if not ( message.get( 'body' ) or {} ).get( 'threads' ):
# This is a protocol error. It is required to return at least one! # This is a protocol error. It is required to return at least one!
utils.UserMessage( 'Protocol error: Server returned no threads', utils.UserMessage( 'Protocol error: Server returned no threads',
persist = False, persist = False,
@ -372,7 +373,9 @@ class StackTraceView( object ):
if thread is None: if thread is None:
utils.UserMessage( 'No thread selected' ) utils.UserMessage( 'No thread selected' )
elif thread.state == Thread.PAUSED: elif thread.state == Thread.PAUSED:
self._session._connection.DoRequest( None, { self._session._connection.DoRequest(
lambda *_: self.OnContinued( { 'threadId': thread.id } ),
{
'command': 'continue', 'command': 'continue',
'arguments': { 'arguments': {
'threadId': thread.id, 'threadId': thread.id,