From 639e0b2ac0fb85335511efcf79327d1f4dfacbc3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?H=C3=A5kan=20Mattsson?=
Date: Wed, 3 Feb 2010 14:27:13 +0000
Subject: OTP-8058 The GUI parts are rewritten to use wxWidgets. Thanks Olle
Mattsson!
For the time being it is still possible to use the old GS based
version of the tool, but it is deprecated. The wxWidgets based
version is started by default.
A new tutorial has been added to the documentation. It is based
on Jayson Vantuyl's article
http://souja.net/2009/04/making-sense-of-erlangs-event-tracer.htm
l.
The functions et:trace_me/4 and et:trace_me/5 has been introduced
in order to replace the deprecated functions et:report_event/4
and et:report_event/5. Hopefully the new names makes it a little
more obvious what the intended usage of the functions are.
A print function has been added to the GUI, in order to enable
printing of sequence charts.
More functionality for hiding unwanted events has been added to
the GUI.
The max_events, hide_unknown and display_mode configuration
parameters to et_viewer is not used any more. Now the event cache
in the Viewer only contains those events that actually are
displayed in the GUI.
Some minor bugs has been fixed. Such as a cleaning up trace
patterns at termination and displaying events with detail level
100.
---
lib/et/doc/src/et_selector.xml | 4 ++--
lib/et/doc/src/et_tutorial.xmlsrc | 2 +-
lib/et/src/et_collector.erl | 24 ++++++++++++++++++++----
lib/et/src/et_gs_viewer.erl | 2 --
lib/et/src/et_internal.hrl | 3 +++
lib/et/src/et_selector.erl | 2 +-
lib/et/src/et_wx_viewer.erl | 8 +++-----
7 files changed, 30 insertions(+), 15 deletions(-)
(limited to 'lib/et')
diff --git a/lib/et/doc/src/et_selector.xml b/lib/et/doc/src/et_selector.xml
index 3e5b030e7a..dd12166d85 100644
--- a/lib/et/doc/src/et_selector.xml
+++ b/lib/et/doc/src/et_selector.xml
@@ -44,7 +44,7 @@
RawPattern = detail_level()
TracePattern = erlang_trace_pattern_match_spec()
- detail_level() = min | max | integer(X) when X =< 0, X >= 100
+ detail_level() = min | max | integer(X) when X >= 0, X =< 100
@@ -65,7 +65,7 @@
Pattern = detail_level() | empty_match_spec() | erlang_trace_pattern_match_spec()
- detail_level() = min | max | integer(X) when X =<0, X >= 100
+ detail_level() = min | max | integer(X) when X >= 0, X =< 100
empty_match_spec() = []
diff --git a/lib/et/doc/src/et_tutorial.xmlsrc b/lib/et/doc/src/et_tutorial.xmlsrc
index 5c2a5a97e4..c72234a587 100644
--- a/lib/et/doc/src/et_tutorial.xmlsrc
+++ b/lib/et/doc/src/et_tutorial.xmlsrc
@@ -56,7 +56,7 @@
The number (in this case 85) is an integer from 1 to 100 that
specifies the "detail level" of the message. The higher the
number, the more important it is. This provides a crude form of
- priority filtering. Avoid using 100.
+ priority filtering.
The from, to, and message parameters are
exactly what they sound like. from and to are
diff --git a/lib/et/src/et_collector.erl b/lib/et/src/et_collector.erl
index 289537541d..a63d15fb4c 100644
--- a/lib/et/src/et_collector.erl
+++ b/lib/et/src/et_collector.erl
@@ -57,6 +57,9 @@
multicast/2
]).
+%% Internal export
+-export([monitor_trace_port/2]).
+
%% gen_server callbacks
-export([init/1,terminate/2, code_change/3,
handle_call/3, handle_cast/2, handle_info/2]).
@@ -144,7 +147,7 @@
%%
%% event_order() = trace_ts | event_ts
%% trace_pattern() = detail_level() | dbg_match_spec()
-%% detail_level() = min | max | integer(X) when X =< 0, X >= 100
+%% detail_level() = min | max | integer(X) when X >= 0, X =< 100
%% trace_client() =
%% {event_file, file_name()} |
%% {dbg_trace_type(), dbg_trace_parameters()}
@@ -415,7 +418,9 @@ report_event(CollectorPid, DetailLevel, FromTo, Label, Contents) ->
report_event(CollectorPid, DetailLevel, FromTo, FromTo, Label, Contents).
report_event(CollectorPid, DetailLevel, From, To, Label, Contents)
- when is_integer(DetailLevel), DetailLevel >= 0, DetailLevel =< 100 ->
+ when is_integer(DetailLevel),
+ DetailLevel >= ?detail_level_min,
+ DetailLevel =< ?detail_level_max ->
TS= erlang:now(),
E = #event{detail_level = DetailLevel,
trace_ts = TS,
@@ -681,6 +686,17 @@ trace_spec_wrapper(EventFun, EndFun, EventInitialAcc)
start_trace_port(Parameters) ->
dbg:tracer(port, dbg:trace_port(ip, Parameters)).
+monitor_trace_port(CollectorPid, Parameters) ->
+ Res = start_trace_port(Parameters),
+ spawn(fun() ->
+ MonitorRef = erlang:monitor(process, CollectorPid),
+ receive
+ {'DOWN', MonitorRef, _, _, _} ->
+ dbg:stop_clear()
+ end
+ end),
+ Res.
+
%%----------------------------------------------------------------------
%% iterate(Handle, Prev, Limit) ->
%% iterate(Handle, Prev, Limit, undefined, Prev)
@@ -1033,7 +1049,7 @@ handle_call(clear_table, _From, S) ->
handle_call(stop, _From, S) ->
do_multicast(S#state.subscribers, close),
case S#state.trace_global of
- true -> rpc:multicall(S#state.trace_nodes, dbg, stop, []);
+ true -> rpc:multicall(S#state.trace_nodes, dbg, stop_clear, []);
false -> ignore
end,
{stop, shutdown, ok, S};
@@ -1067,7 +1083,7 @@ handle_info(timeout, S) ->
handle_info({nodeup, Node}, S) ->
Port = S#state.trace_port,
MaxQueue = S#state.trace_max_queue,
- case rpc:call(Node, ?MODULE, start_trace_port, [{Port, MaxQueue}]) of
+ case rpc:call(Node, ?MODULE, monitor_trace_port, [self(), {Port, MaxQueue}]) of
{ok, _} ->
S2 = listen_on_trace_port(Node, Port, S),
noreply(S2);
diff --git a/lib/et/src/et_gs_viewer.erl b/lib/et/src/et_gs_viewer.erl
index 7235269aff..0af7814d15 100644
--- a/lib/et/src/et_gs_viewer.erl
+++ b/lib/et/src/et_gs_viewer.erl
@@ -75,8 +75,6 @@
-define(incr_x, 60).
-define(initial_y, 15).
-define(incr_y, 15).
--define(detail_level_min, 0).
--define(detail_level_max, 100).
%%%----------------------------------------------------------------------
%%% Client side
diff --git a/lib/et/src/et_internal.hrl b/lib/et/src/et_internal.hrl
index 1feb161ef1..419d35afcd 100644
--- a/lib/et/src/et_internal.hrl
+++ b/lib/et/src/et_internal.hrl
@@ -20,6 +20,9 @@
%% Purpose: Definition of internal data structures
%%----------------------------------------------------------------------
+-define(detail_level_min, 0).
+-define(detail_level_max, 100).
+
-record(filter, {name, function}).
-define(DEFAULT_FILTER_NAME, all).
diff --git a/lib/et/src/et_selector.erl b/lib/et/src/et_selector.erl
index 66f5723bad..f39f21aa70 100644
--- a/lib/et/src/et_selector.erl
+++ b/lib/et/src/et_selector.erl
@@ -39,7 +39,7 @@
%% RawPattern = detail_level()
%% TracePattern = erlang_trace_pattern_match_spec()
%%
-%% detail_level() = min | max | integer(X) when X =< 0, X >= 100
+%% detail_level() = min | max | integer(X) when X >= 0, X =< 100
%%
%% min - minimum level of tracing (ignore calls to trace_me/4,5)
%% max - maximum level of tracing (all calls to trace_me/4,5)
diff --git a/lib/et/src/et_wx_viewer.erl b/lib/et/src/et_wx_viewer.erl
index 1e2677e216..5cd3563aed 100644
--- a/lib/et/src/et_wx_viewer.erl
+++ b/lib/et/src/et_wx_viewer.erl
@@ -40,8 +40,6 @@
-define(incr_x, 60).
-define(initial_y, 15).
-define(incr_y, 15).
--define(detail_level_min, 0).
--define(detail_level_max, 100).
-record(state,
{parent_pid, % Pid of parent process
@@ -175,8 +173,8 @@ parse_opt([H | T], S, CollectorOpt) ->
{title, Title} ->
parse_opt(T, S#state{title = name_to_string(Title)}, CollectorOpt);
{detail_level, Level} when is_integer(Level),
- Level >= ?detail_level_min,
- Level =< ?detail_level_max ->
+ Level >= ?detail_level_min,
+ Level =< ?detail_level_max ->
parse_opt(T, S#state{detail_level = Level}, CollectorOpt);
{detail_level, max} ->
parse_opt(T, S#state{detail_level = ?detail_level_max}, CollectorOpt);
@@ -1558,7 +1556,7 @@ collect_event(Event, {S, Incr, Order, Active, FilterFun, #e{pos = PrevPos}, Even
{S, Incr, Order, Active, FilterFun, LastE, Events2}.
display_event(#e{event = Event} = E, S, DC)
- when Event#event.detail_level < S#state.detail_level ->
+ when Event#event.detail_level =< S#state.detail_level ->
{FromRefresh, From} = ensure_actor(Event#event.from, S, DC),
{FromName, FromPos, S2} = From,
{ToRefresh, To} = ensure_actor(Event#event.to, S2, DC),
--
cgit v1.2.3