Skip to content

Commit 004db36

Browse files
wk8ignatov
authored andcommitted
Adding the ability to evaluate arbitrary expressions while debugging (#797)
This patch allows users to evaluate arbitrary Erlang expressions while debugging. Part of the support had been added (at least on the Erlang side) in 9b6f4e1, but seems it was never properly hooked up to the Java side.
1 parent 5015c86 commit 004db36

18 files changed

+180
-39
lines changed
-44 Bytes
Binary file not shown.
-48 Bytes
Binary file not shown.
436 Bytes
Binary file not shown.
48 Bytes
Binary file not shown.

resources/debugger/src/remote_debugger_listener.erl

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
-include("remote_debugger_messages.hrl").
99
-include("trace_utils.hrl").
1010

11-
-record(state, {interpreted_modules = []}).
11+
-record(state, {interpreted_modules = [] :: [module()]}).
1212

1313
run(Debugger) ->
1414
register(?RDEBUG_LISTENER, self()),
@@ -60,9 +60,9 @@ process_message({step_out, Pid}) when is_pid(Pid) ->
6060
step_out(Pid);
6161
process_message({continue, Pid}) when is_pid(Pid) ->
6262
continue(Pid);
63-
process_message({evaluate, Pid, Expression}) when is_pid(Pid),
64-
is_list(Expression) ->
65-
evaluate(Pid, Expression);
63+
process_message({evaluate, Pid, Expression, MaybeStackPointer}) when is_pid(Pid),
64+
is_list(Expression) ->
65+
evaluate(Pid, Expression, MaybeStackPointer);
6666
% responses from interpreter
6767
process_message({_Meta, {eval_rsp, EvalResponse}}) ->
6868
evaluate_response(EvalResponse);
@@ -108,12 +108,17 @@ step_out(Pid) ->
108108
continue(Pid) ->
109109
int:continue(Pid).
110110

111-
evaluate(Pid, Expression) ->
111+
evaluate(Pid, Expression, MaybeStackPointer) ->
112112
{ok, Meta} = dbg_iserver:call({get_meta, Pid}),
113-
int:meta(Meta, eval, {undefined, Expression}). % Current module should be passed instead of 'undefined'
113+
MetaArgsList = [?MODULE, Expression],
114+
MetaArgsListWithSP = case MaybeStackPointer =:= undefined of
115+
true -> MetaArgsList;
116+
false -> MetaArgsList ++ [MaybeStackPointer]
117+
end,
118+
int:meta(Meta, eval, list_to_tuple(MetaArgsListWithSP)).
114119

115-
evaluate_response(Response) ->
116-
?RDEBUG_NOTIFIER ! #evaluate_response{result = Response}.
120+
evaluate_response(EvalResponse) ->
121+
?RDEBUG_NOTIFIER ! #evaluate_response{result = EvalResponse}.
117122

118123
parse_args(ArgsString) ->
119124
case erl_scan:string(ArgsString ++ ".") of
@@ -165,4 +170,4 @@ send_interpret_modules_response(Node, IntResults) ->
165170
({Module, {module, _}}) -> {Module, ok};
166171
({Module, error}) -> {Module, int:interpretable(Module)}
167172
end, IntResults),
168-
?RDEBUG_NOTIFIER ! #interpret_modules_response{node = Node, statuses = Statuses}.
173+
?RDEBUG_NOTIFIER ! #interpret_modules_response{node = Node, statuses = Statuses}.

resources/debugger/src/remote_debugger_messages.hrl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
-record(step_over, {pid}).
1010
-record(step_out, {pid}).
1111
-record(continue, {pid}).
12-
-record(evaluate, {pid, expression}). % TODO consider adding a stack pointer as third param
12+
-record(evaluate, {pid, expression, maybeStackPointer}).
1313

1414
% Messages which can be sent to remote debugger.
1515
% Debugger implementation should handle all messages listed here.

resources/debugger/src/remote_debugger_notifier.erl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,4 @@ do_get_stackframes(Pid) ->
4444
end.
4545

4646
get_bindings(MetaPid, SP) ->
47-
int:meta(MetaPid, bindings, SP).
47+
int:meta(MetaPid, bindings, SP).

src/org/intellij/erlang/debugger/node/ErlangDebuggerEventListener.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package org.intellij.erlang.debugger.node;
1818

19+
import com.ericsson.otp.erlang.OtpErlangObject;
1920
import com.ericsson.otp.erlang.OtpErlangPid;
2021

2122
import java.util.List;
@@ -29,4 +30,5 @@ public interface ErlangDebuggerEventListener {
2930
void breakpointIsSet(String module, int line);
3031
void breakpointReached(OtpErlangPid pid, List<ErlangProcessSnapshot> snapshots);
3132
void debuggerStopped();
33+
void handleEvaluationResponse(OtpErlangObject response);
3234
}

src/org/intellij/erlang/debugger/node/ErlangDebuggerNode.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,10 @@ public void resume() {
117117
addCommand(ErlangDebuggerCommandsProducer.getContinueCommand(myLastSuspendedPid));
118118
}
119119

120+
public void evaluate(@NotNull String expression, @NotNull ErlangTraceElement traceElement) {
121+
addCommand(ErlangDebuggerCommandsProducer.getEvaluateCommand(myLastSuspendedPid, expression, traceElement));
122+
}
123+
120124
private void addCommand(ErlangDebuggerCommandsProducer.ErlangDebuggerCommand command) {
121125
synchronized (myCommandsQueue) {
122126
myCommandsQueue.add(command);

src/org/intellij/erlang/debugger/node/ErlangTraceElement.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,24 +17,31 @@
1717
package org.intellij.erlang.debugger.node;
1818

1919
import com.ericsson.otp.erlang.OtpErlangList;
20+
import com.ericsson.otp.erlang.OtpErlangObject;
2021
import org.jetbrains.annotations.NotNull;
22+
import org.jetbrains.annotations.Nullable;
2123

2224
import java.util.Collection;
2325

2426
public class ErlangTraceElement {
27+
private final OtpErlangObject myStackPointer;
2528
private final String myModule;
2629
private final String myFunction;
2730
private final OtpErlangList myFunctionArgs;
2831
private final Collection<ErlangVariableBinding> myBindings;
2932

30-
public ErlangTraceElement(@NotNull String module, @NotNull String function, @NotNull OtpErlangList functionArgs,
31-
@NotNull Collection<ErlangVariableBinding> bindings) {
33+
public ErlangTraceElement(@Nullable OtpErlangObject stackPointer, @NotNull String module, @NotNull String function,
34+
@NotNull OtpErlangList functionArgs, @NotNull Collection<ErlangVariableBinding> bindings) {
35+
myStackPointer = stackPointer;
3236
myModule = module;
3337
myFunction = function;
3438
myFunctionArgs = functionArgs;
3539
myBindings = bindings;
3640
}
3741

42+
@Nullable
43+
public OtpErlangObject getStackPointer() { return myStackPointer; }
44+
3845
@NotNull
3946
public String getModule() {
4047
return myModule;

0 commit comments

Comments
 (0)