diff options
Diffstat (limited to 'lib/runtime_tools/test/dbg_SUITE.erl')
-rw-r--r-- | lib/runtime_tools/test/dbg_SUITE.erl | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/lib/runtime_tools/test/dbg_SUITE.erl b/lib/runtime_tools/test/dbg_SUITE.erl index 9c9d6ca352..db4aad7341 100644 --- a/lib/runtime_tools/test/dbg_SUITE.erl +++ b/lib/runtime_tools/test/dbg_SUITE.erl @@ -22,6 +22,7 @@ %% Test functions -export([all/0, suite/0, big/1, tiny/1, simple/1, message/1, distributed/1, port/1, + send/1, ip_port/1, file_port/1, file_port2/1, file_port_schedfix/1, ip_port_busy/1, wrap_port/1, wrap_port_time/1, with_seq_trace/1, dead_suspend/1, local_trace/1, @@ -39,6 +40,7 @@ suite() -> all() -> [big, tiny, simple, message, distributed, port, ip_port, + send, file_port, file_port2, file_port_schedfix, ip_port_busy, wrap_port, wrap_port_time, with_seq_trace, dead_suspend, local_trace, saved_patterns, tracer_exit_on_stop, @@ -151,6 +153,74 @@ message(Config) when is_list(Config) -> {trace,S,call,{dbg,ln,[]},S}] = flush(), ok. +send(Config) when is_list(Config) -> + {ok, _} = start(), + try + S = self(), + Rcvr = spawn_link(fun F() -> + receive M -> + S ! M, + F() + end + end), + + {ok, [{matched, _, 1}]} = dbg:p(Rcvr, send), + R1 = Rcvr ! make_ref(), + receive R1 -> ok end, + [{trace, Rcvr, send, R1, S}] = flush(), + + {ok, [{matched, _node, 1}, {saved, 1}]} = dbg:tpe(send, [{[S,'_'],[],[]}]), + R2 = Rcvr ! make_ref(), + receive R2 -> ok end, + [{trace, Rcvr, send, R2, S}] = flush(), + + {ok, [{matched, _node, 1}, {saved, 2}]} = + dbg:tpe(send, [{['$1','_'],[{'==','$1',{self}}],[]}]), + R3 = Rcvr ! make_ref(), + receive R3 -> ok end, + [] = flush(), + + {ok, [{matched, _node, 1}, {saved, 3}]} = + dbg:tpe(send, [{['_','_'],[{'==',Rcvr,{self}}],[]}]), + R4 = Rcvr ! make_ref(), + receive R4 -> ok end, + [{trace, Rcvr, send, R4, S}] = flush(), + + {ok, [{matched, _node, 1}, {saved, 4}]} = + dbg:tpe(send, [{['_','_'],[{'==',Rcvr,{self}}],[{message, hello}]}]), + R5 = Rcvr ! make_ref(), + receive R5 -> ok end, + [{trace, Rcvr, send, R5, S, hello}] = flush(), + + {ok, [{matched, _node, 1}, {saved, 2}]} = dbg:tpe(send, 2), + R6 = Rcvr ! make_ref(), + receive R6 -> ok end, + [] = flush(), + + {ok, [{matched, _node, 1}]} = dbg:ctpe(send), + R7 = Rcvr ! make_ref(), + receive R7 -> ok end, + [{trace, Rcvr, send, R7, S, hello}] = flush(), + + R8 = make_ref(), + {ok, [{matched, _node, 1}, {saved, 5}]} = + dbg:tpe(send, [{['_','$2'],[{'==',R8,{element, 1, {element, 2, '$2'}}}], + [{message, hello}]}]), + Msg1 = Rcvr ! {test, {R8}, <<0:(8*1024)>>}, + receive Msg1 -> ok end, + [{trace, Rcvr, send, Msg1, S, hello}] = flush(), + + R9 = make_ref(), + Msg2 = Rcvr ! {test, {R9}, <<0:(8*1024)>>}, + receive Msg2 -> ok end, + [] = flush(), + + ok + + after + stop() + end. + %% Simple test of distributed tracing distributed(Config) when is_list(Config) -> {ok, _} = start(), @@ -859,6 +929,17 @@ flush(Acc) -> Acc end. +flush_trace() -> + flush_trace([]). +flush_trace(Acc) -> + receive + X when element(1,X) =:= trace; + element(1,X) =:= trace_ts + -> flush_trace(Acc ++ [X]) + after 1000 -> + Acc + end. + start() -> stop(), dbg:tracer(process, {fun myhandler/2, self()}). |