Skip to content

Commit

Permalink
version 0.0.2 improved dbv viewing.
Browse files Browse the repository at this point in the history
  • Loading branch information
Andy Till committed Sep 16, 2014
1 parent 15c1707 commit 03b1a8c
Show file tree
Hide file tree
Showing 5 changed files with 100 additions and 12 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

<groupId>andytill</groupId>
<artifactId>erlyberly</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>0.0.2</version>
<packaging>jar</packaging>

<name>erlyberly</name>
Expand Down
67 changes: 63 additions & 4 deletions src/main/java/erlyberly/DbgView.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,34 +4,42 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.ResourceBundle;

import javafx.beans.InvalidationListener;
import javafx.beans.Observable;
import javafx.collections.ListChangeListener;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.layout.VBox;

import com.ericsson.otp.erlang.OtpErlangAtom;
import com.ericsson.otp.erlang.OtpErlangList;
import com.ericsson.otp.erlang.OtpErlangObject;
import com.ericsson.otp.erlang.OtpErlangRangeException;
import com.ericsson.otp.erlang.OtpErlangString;
import com.ericsson.otp.erlang.OtpErlangTuple;

import erlyberly.node.OtpUtil;

public class DbgView implements Initializable {

private static final OtpErlangAtom ATOM_PID = new OtpErlangAtom("pid");
private static final OtpErlangAtom ATOM_REG_NAME = new OtpErlangAtom("reg_name");
private static final OtpErlangAtom ATOM_UNDEFINED = new OtpErlangAtom("undefined");
@FXML
private TreeView<ModFunc> modulesTree;
@FXML
private ListView<Object> traceLogsListView;
@FXML
private Label traceTargetLabel;
@FXML
private Button goButton;
@FXML
private VBox tracesBox;

private final DbgController dbgController = new DbgController();

Expand All @@ -42,7 +50,23 @@ public void initialize(URL url, ResourceBundle r) {
public void invalidated(Observable o) {
onConnected();
}});
traceLogsListView.setItems(dbgController.getTraces());
dbgController.getTraces().addListener(new ListChangeListener<Object>() {
@Override
public void onChanged(ListChangeListener.Change<? extends Object> e) {
while(e.next()) {
for (Object obj : e.getAddedSubList()) {
HashMap<Object, Object> map = OtpUtil.propsToMap((OtpErlangList) obj);
String tracePropsToString = tracePropsToString(map);

Label label;

label = new Label(tracePropsToString);
label.setStyle("-fx-font-smoothing-type:lcd; ");

tracesBox.getChildren().add(0, label);
}
}
}});

goButton.disableProperty().bind(modulesTree.getSelectionModel().selectedItemProperty().isNull());

Expand Down Expand Up @@ -148,6 +172,41 @@ private ArrayList<ModFunc> toModFuncs(OtpErlangAtom moduleNameAtom, OtpErlangLis
}
Collections.sort(mfs);
return mfs;
}

private String tracePropsToString(HashMap<Object, Object> map) {
String trace = "";

OtpErlangAtom regName = (OtpErlangAtom) map.get(ATOM_REG_NAME);

if(!ATOM_UNDEFINED.equals(regName)) {
trace += regName.atomValue();
}
else {
OtpErlangString pidString = (OtpErlangString) map.get(ATOM_PID);
trace += pidString.stringValue();
}
trace += " ";
trace += fnToFunctionString((OtpErlangTuple)map.get(new OtpErlangAtom("fn")));
trace += " => ";
trace += map.get(new OtpErlangAtom("result")).toString();

return trace;
}

private String fnToFunctionString(OtpErlangTuple tuple) {
OtpErlangAtom mod = (OtpErlangAtom) tuple.elementAt(0);
OtpErlangAtom func = (OtpErlangAtom) tuple.elementAt(1);
OtpErlangList args = (OtpErlangList) tuple.elementAt(2);
ArrayList<String> sargs = new ArrayList<String>();
for (OtpErlangObject otpErlangObject : args) {
sargs.add(otpErlangObject.toString());
}

String join = String.join(", ", sargs);

String fn = mod.atomValue() + ":" + func.atomValue() + "(" + join + ")";

return fn;
}
}
Binary file modified src/main/resources/erlyberly/beam/erlyberly.beam
Binary file not shown.
32 changes: 27 additions & 5 deletions src/main/resources/erlyberly/beam/erlyberly.erl
Original file line number Diff line number Diff line change
Expand Up @@ -59,18 +59,40 @@ start_trace(Mod, Func, Arity, IsExported) ->
store_trace(Trace) ->
erlyberly_tcollector ! Trace.

-record(tcollector, { call, logs = [] }).

erlyberly_tcollector() ->
erlyberly_tcollector2([]).
erlyberly_tcollector2(#tcollector{}).

erlyberly_tcollector2(Acc) ->
erlyberly_tcollector2(#tcollector{ logs = Logs } = TC) ->
receive
{take_logs, Pid} ->
Pid ! {trace_logs, lists:reverse(Acc)},
erlyberly_tcollector2([]);
Pid ! {trace_logs, lists:reverse(Logs)},
erlyberly_tcollector2(TC#tcollector{ logs = []});
Log ->
erlyberly_tcollector2([Log | Acc])
TC1 = collect_log(Log, TC),
erlyberly_tcollector2(TC1)
end.

collect_log({trace, Pid, call, Args, CallingMFA}, #tcollector{ call = undefined } = TC) ->
TC#tcollector{ call = {Pid, Args, CallingMFA} };
collect_log({trace, Pid, return_from, _Func, Result}, #tcollector{ call = {Pid, Args, CallingMFA}, logs = Logs } = TC) ->

Reg_name = case erlang:process_info(Pid, registered_name) of
[{_, Name}] -> Name;
{_, Name} -> Name;
_ -> undefined
end,
Log = [ {pid, pid_to_list(Pid)},
{reg_name, Reg_name},
{calling_fn, CallingMFA},
{fn, Args},
{result, Result} ],
TC#tcollector{ call = undefined, logs = [Log | Logs]};
collect_log(_, TC) ->
TC.


collect_trace_logs() ->
erlyberly_tcollector ! {take_logs, self()},
receive
Expand Down
11 changes: 9 additions & 2 deletions src/main/resources/erlyberly/dbg.fxml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
<?import java.lang.*?>
<?import javafx.scene.layout.*?>


<SplitPane dividerPositions="0.5" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="erlyberly.DbgView">
<items>
<VBox>
Expand All @@ -22,6 +21,14 @@
<TreeView fx:id="modulesTree" prefHeight="200.0" prefWidth="200.0" VBox.vgrow="ALWAYS" />
</children>
</VBox>
<ListView fx:id="traceLogsListView" prefHeight="200.0" prefWidth="200.0" />
<AnchorPane>
<children>
<ScrollPane prefHeight="235.0" prefWidth="200.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<content>
<VBox fx:id="tracesBox" />
</content>
</ScrollPane>
</children>
</AnchorPane>
</items>
</SplitPane>

0 comments on commit 03b1a8c

Please sign in to comment.