1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
-module(erl_tracer).
-export([enabled/3, trace/5, on_load/0]).
-type tracee() :: port() | pid() | undefined.
-type trace_tag_running_ports() :: in | out | in_exiting | out_exiting | out_exited.
-type trace_tag_running_procs() :: in | out | in_exiting | out_exiting | out_exited.
-type trace_tag_send() :: send | send_to_non_existing_process.
-type trace_tag_receive() :: 'receive'.
-type trace_tag_call() :: call | return_to | return_from | exception_from.
-type trace_tag_procs() :: spawn | spawned | exit | link | unlink
| getting_linked | getting_unlinked
| register | unregister.
-type trace_tag_ports() :: open | closed | link | unlink
| getting_linked | getting_unlinked.
-type trace_tag_gc() :: gc_minor_start | gc_minor_end
| gc_major_start | gc_major_end.
-type trace_tag() :: trace_tag_send()
| trace_tag_receive()
| trace_tag_call()
| trace_tag_procs()
| trace_tag_ports()
| trace_tag_running_procs()
| trace_tag_running_ports()
| trace_tag_gc().
-type trace_opts() :: #{ extra => term(), match_spec_result => term(),
scheduler_id => non_neg_integer(),
timestamp => timestamp | cpu_timestamp |
monotonic | strict_monotonic }.
-type tracer_state() :: term().
on_load() ->
case erlang:load_nif(atom_to_list(?MODULE), 0) of
ok -> ok
end.
%%%
%%% NIF placeholders
%%%
%% This suppression is needed as trace_tag gets collapsed to atom()
-dialyzer({no_contracts, enabled/3}).
-spec enabled(Tag :: trace_status,
TracerState :: tracer_state(),
Tracee :: tracee()) ->
trace | remove;
(Tag :: trace_tag() | seq_trace,
TracerState :: tracer_state(),
Tracee :: tracee()) ->
trace | discard.
enabled(_, _, _) ->
erlang:nif_error(nif_not_loaded).
-spec trace(Tag :: trace_tag() | seq_trace,
TracerState :: tracer_state(),
Tracee :: tracee(),
Msg :: term(),
Opts :: trace_opts()) -> any().
trace(_, _, _, _, _) ->
erlang:nif_error(nif_not_loaded).
|