I glad to release first version of RemoteDebuggingTools project. It allows explore and debug remote images.
Here is demo with debugging Seaside application:
On server side you need to install Server group of project:
Metacello new
smalltalkhubUser: 'Pharo' project: 'RemoteDebuggingTools';
configuration: 'RemoteDebuggingTools';
version: #stable;
load: 'Server'.
Then server should be started on port where client image could connect:
RemoteUIManager registerOnPort: 40423.
Also image could be started with running server from command line:
./pharo PharoWithServer.image debuggerServer --port=40423
On client side Client group should be installed
Metacello new
smalltalkhubUser: 'Pharo' project: 'RemoteDebuggingTools';
configuration: 'RemoteDebuggingTools';
version: #stable;
load: 'Client'.
Then RemoteDebugger could connect to target image:
debugger := RemoteDebugger connectTo: (TCPAddress ip: #[127 0 0 1] port: 40423).
It registers a RemoteDebugger as debugger tool on remote image. Any error there will open debugger on client image with remote process stack.
With connected debugger instance you can execute scripts:
debugger evaluateAsync: [ [1/0] fork ].
debugger evaluate: [ 1 + 2 ] "==> 3".
debugger evaluate: [ 0@0 corner: 2@3 ] "==> aSeamlessProxy on remote rectangle".
Async evaluation not returns any result of block. It just transfer block to remote side and not waits any result.
Normal evaluation will wait until block competes on remote side. And result will be returned. There is nice integration with GTTools to inspect remote objects.
Blocks could reference local objects like temps or workspace variables. You can write scripts like:
result := OrderedCollection new.
debugger evaluateAsync: [100 to: 500 do: [ :i | result add: i factorial] ].
Non local return is also supported. Following expression works same way as local block evaluation:
debugger evaluate: [ 100 to: 500 do: [ :i | i > 200 ifTrue: [^i] ]].
This project (with scripting facilities) are based on new version of Seamless which will be announced soon next time. It misses very important feature now: distributed garbage collection. When you finish your debugging session you need manually disconnect your debugger. It will clean all garbage:
debugger disconnect.
Other restrictions which will be covered in future:
Here is demo with debugging Seaside application:
On server side you need to install Server group of project:
Metacello new
smalltalkhubUser: 'Pharo' project: 'RemoteDebuggingTools';
configuration: 'RemoteDebuggingTools';
version: #stable;
load: 'Server'.
Then server should be started on port where client image could connect:
RemoteUIManager registerOnPort: 40423.
Also image could be started with running server from command line:
./pharo PharoWithServer.image debuggerServer --port=40423
On client side Client group should be installed
Metacello new
smalltalkhubUser: 'Pharo' project: 'RemoteDebuggingTools';
configuration: 'RemoteDebuggingTools';
version: #stable;
load: 'Client'.
Then RemoteDebugger could connect to target image:
debugger := RemoteDebugger connectTo: (TCPAddress ip: #[127 0 0 1] port: 40423).
It registers a RemoteDebugger as debugger tool on remote image. Any error there will open debugger on client image with remote process stack.
With connected debugger instance you can execute scripts:
debugger evaluateAsync: [ [1/0] fork ].
debugger evaluate: [ 1 + 2 ] "==> 3".
debugger evaluate: [ 0@0 corner: 2@3 ] "==> aSeamlessProxy on remote rectangle".
Async evaluation not returns any result of block. It just transfer block to remote side and not waits any result.
Normal evaluation will wait until block competes on remote side. And result will be returned. There is nice integration with GTTools to inspect remote objects.
Blocks could reference local objects like temps or workspace variables. You can write scripts like:
result := OrderedCollection new.
debugger evaluateAsync: [100 to: 500 do: [ :i | result add: i factorial] ].
Non local return is also supported. Following expression works same way as local block evaluation:
debugger evaluate: [ 100 to: 500 do: [ :i | i > 200 ifTrue: [^i] ]].
This project (with scripting facilities) are based on new version of Seamless which will be announced soon next time. It misses very important feature now: distributed garbage collection. When you finish your debugging session you need manually disconnect your debugger. It will clean all garbage:
debugger disconnect.
Other restrictions which will be covered in future:
- debugging expressions from debugger is not working (debugIt from context menu)
- code browse and navigation are not working. Nautilus and MessagesBrowser should be able to work with remote environment.
- remote stack items are printed with prefix SeamlessProxy. It should be improved
- printIt inside debugger/inspector should return remote printString instead of aSeamlessProxy.
- no security: no authorization and encryption. Now for security purpose you need external tools like VPN
Комментариев нет:
Отправить комментарий