Skip to main content

%Atelier.v2.XDebugAgent

Class %Atelier.v2.XDebugAgent Extends %CSP.WebSocket

This class serves as a debug agent for debugging processes. It receives client debugging commands, sends then to the debug target, gets responses, and sends them back to the client. The implementation is based on the XDEBUG DBGP protocol used by the eclipse DLTK.
http://xdebug.org/docs-dbgp.php

Parameters

DOMAIN

Parameter DOMAIN = "%XDEBUG";

Parameter for Localization

SECURITYRESOURCE

Parameter SECURITYRESOURCE = "%Development";

Require development resource

NULLSTATE

Parameter NULLSTATE = 0;

EXITSTATE

Parameter EXITSTATE = 1;

STOP

Parameter STOP = 2;

IDLE

Parameter IDLE = "OnIdle";

TIMEOUT

Parameter TIMEOUT = 0.1;

CLASS

Parameter CLASS = 2;

This is the CLASS context for variable display in the IDE

PUBLIC

Parameter PUBLIC = 1;

This is the PUBLIC context for variable display in the IDE

PRIVATE

Parameter PRIVATE = 0;

This is the PRIVATE context for variable display in the IDE

Properties

Command

Property Command As %String [ MultiDimensional ];

This holds the current command

DebugTarget

Property DebugTarget As %String;

This holds the debug_target (passsed to us by set_feature)

NextState

Property NextState As %String [ InitialExpression = {..#NULLSTATE} ];

This holds the next state to switch to

State

Property State As %String [ InitialExpression = {..#NULLSTATE}, Internal ];

This holds the current state of the FSM, Initial state is "{..#NULLSTATE}" Before the machine can run a valid state needs to be established

Debug

Property Debug As %Debugger.System;

This holds the debugger instance

Trace

Property Trace As %Boolean [ InitialExpression = {$Get(^IRIS.Temp.Atelier("debug"))>0} ];

This holds the TRACE flag

TraceNode

Property TraceNode As %Integer;

This holds the TRACE global node for this session

DeviceList

Property DeviceList As %List;

This holds the device list for $System.Socket.Select

WebSocketDevice

Property WebSocketDevice As %String;

This holds the websocket device

TargetOrPID

Property TargetOrPID As %String;

This holds the target OR PID

Attached

Property Attached As %Boolean [ InitialExpression = 0 ];

This holds the attached flag

StartedAttach

Property StartedAttach As %Boolean [ InitialExpression = 0 ];

This says we started via Attach instead of Launch

ContinuationCmdIssued

Property ContinuationCmdIssued As %Boolean [ InitialExpression = 0 ];

This holds the Continuation command issued flag

TransactionId

Property TransactionId As %String [ MultiDimensional ];

This holds the current transaction identifier

CSPId

Property CSPId As %String;

SessionId if attached to a CSP process

BreakPoints

Property BreakPoints As %String [ MultiDimensional ];

Breakpoints

LastContinuationCmd

Property LastContinuationCmd As %String;

This holds the last 'continuation' command issued Continuation commands are 'run','step_into','step_over','step_out' 'stop' and 'detach'. We need to record this so that the appropriate status message can be reported to the client when a breakpoint is hit or the program ends.

StackLevelMappings

Property StackLevelMappings As %Integer [ MultiDimensional ];

This holds the mappings from server stack level to IDE stack level

Features

Property Features As %String [ MultiDimensional ];

This holds the values of the features set by the IDE

FirstRunCommandSeen

Property FirstRunCommandSeen As %Boolean [ InitialExpression = 0 ];

This holds the first run command flag

Methods

Server

Method Server() As %Status

The WebSocket Server

OnIdle

Method OnIdle() As %Status [ Internal, Private ]

This where we receive and dispatch commands and pump debuggee output

FlushOutput

Method FlushOutput()

Flush output before breaking the connection

GetInitMsg

Method GetInitMsg(Output pInitMsg) As %Status

Get InitMsg

TidyUp

Method TidyUp(pStatus) As %Status

Here we do state specific tidy up (will be called if an error has occurred)

OnPreServer

Method OnPreServer() As %Status

Event handler for the PreServer event: this is invoked before starting the WebSockets Server. Changes to the SharedConnection flag must be made here.

InitTrace

Method InitTrace()

Intialize the trace (if required)

Trace

Method Trace(pMsg As %String)

Log a trace if tracing enabled

ParseCommand

Method ParseCommand(pCmdString As %String, Output pParsed) As %Status

Parse XDebug command Definition:- cmd : cmdname [ arglist ]; cmdname : lowercase STRING arglist : arg | [ arg arglist ]; arg : argid argval argid : '-' CHAR argval : STRING Example:- feature_get -i 6 -n language_supports_threads The command string is parsed into this structure:- var="feature_get" var("-i")=6 var("-n")="language_supports_threads"

MapCommandToHandler

Method MapCommandToHandler(pCmdString As %String) As %Status

Map the command to the associated handler (assumes valid command) Some commands are handled inline

ReportEvent

Method ReportEvent(pEvent As %String, pXmlData = "") As %Status

Report an event by writing to the WebSocket

Interpolate

ClassMethod Interpolate(pString, pTerm, pValue) As %String [ CodeMode = expression ]

Utility method to interpolate values in a string

Attach

Method Attach() As %Status

Utility method to attach to the target process

AttachCSP

Method AttachCSP() As %Status

Utility method to attach to a CSP process

Launch

Method Launch() As %Status

Utility method to launch the target given the properties set by set_feature

stop

Method stop()

IDE Command handler for 'stop' command

detach

Method detach()

IDE Command handler for 'detach' command

"feature_get"

Method "feature_get"() As %Status

IDE Command handler for 'feature_get' command

"feature_set"

Method "feature_set"() As %Status

IDE Command handler for 'feature_set' command

break

Method break() As %Status

IDE Command handler for 'break' command

"watchpoint_set"

Method "watchpoint_set"() As %Status

IDE (pseudo) Command handler for 'watchpoint_set' command breakpoint_set -m DebugMe -n 2 -r 0 -s enabled -t watch -f dbgp://|USER|User.Debug.cls -i 22 -- WA==

"breakpoint_set"

Method "breakpoint_set"() As %Status

IDE Command handler for 'breakpoint_set' command breakpoint_set -m DebugMe -n 3 -r 0 -s enabled -t line -f dbgp://|USER|User.Debug.cls -i 10"

"breakpoint_get"

Method "breakpoint_get"() As %Status

breakpoint_get -d User.Debug.cls:DebugMe:3 -i 51"

"breakpoint_list"

Method "breakpoint_list"() As %Status

breakpoint_list

"breakpoint_remove"

Method "breakpoint_remove"() As %Status

breakpoint_remove

"breakpoint_update"

Method "breakpoint_update"() As %Status

breakpoint_update

"context_names"

Method "context_names"() As %Status

IDE Command handler for 'context_names' command

"context_get"

Method "context_get"() As %Status

IDE Command handler for 'context_get' command

eval

Method eval() As %Status

IDE Command handler for 'eval' command

"property_set"

Method "property_set"() As %Status

IDE Command handler for 'property_set' command

"property_get"

Method "property_get"() As %Status

IDE Command handler for 'property_get' command

"property_value"

Method "property_value"() As %Status

IDE Command handler for 'property_value' command

run

Method run() As %Status

IDE Command handler for 'run' command

"step_into"

Method "step_into"() As %Status

IDE Command handler for 'step_into' command

"step_over"

Method "step_over"() As %Status

IDE Command handler for 'step_over' command

"step_out"

Method "step_out"() As %Status

IDE Command handler for 'step_over' command

stderr

Method stderr() As %Status

stdout

Method stdout() As %Status

stdin

Method stdin() As %Status

IDE Command handler for 'stdin' command

"stack_get"

Method "stack_get"() As %Status

IDE Command handler for 'stack_get' command

CreateErrorResponse

Method CreateErrorResponse(pCmd As %String, pErrorCode As %Integer, pTransactionId As %Integer, pMsg As %String) As %String

Create an error response including error code and message to be displayed by IDE

CreatePropertyResponse

Method CreatePropertyResponse(pVarName As %String, pVarValue As %String, Output pXML As %String, pNumChildren = 0) As %Status

Given a variable name and a value, create a property for reporting to the IDE

GetClassProperties

Method GetClassProperties(Output pPropList As %String) As %Status

Get the properties for the CLASS context

GetStackProperties

Method GetStackProperties(pContext As %Integer, pServerLevel As %Integer, Output pPropList As %String) As %Status

Given a context (LOCAL,GLOBAL) and stack level, get the variables defined at that level

GetClientPosFromDebugPos

ClassMethod GetClientPosFromDebugPos(pServerIntPos, Output pMapped, ByRef pNameSpace, Output pDocName, Output pLabel, Output pOffset)

This method is given the debugger position (in the INT code) and returns a logical docname,label and offset The client will have to perform addtional logic to find exactly where in the source document the location is If pMapped is 0, then there is no source

requote

ClassMethod requote(value As %String) As %String

Given a string that is the output of Quote(), check for control characters that were left inside a quoted literal. If found, Quote that literal and insert it back into the original string. This is done carefully so we don't end up with double-double quotes.