Skip to content

Instantly share code, notes, and snippets.

@arcusfelis
Created March 25, 2015 17:16
Show Gist options
  • Save arcusfelis/2cfe542f0ab25603e52d to your computer and use it in GitHub Desktop.
Save arcusfelis/2cfe542f0ab25603e52d to your computer and use it in GitHub Desktop.
portable_tracer.erl
-module(portable_tracer).
%% API
-export([spawn_remote_tracer/3,
spawn_tracer/3]).
%% Private
-export([tracer_cycle/1]).
-compile(debug_info).
inject_code(Node) ->
copy_module_forms(?MODULE, Node).
copy_module_forms(Module, Node) ->
Beam = code:which(Module),
{ok,{_,[{abstract_code,{_,Forms}}]}} = beam_lib:chunks(Beam, [abstract_code]),
{ok, Module, Binary} = rpc:call(Node, compile, forms, [Forms]),
{module, Module} = rpc:call(Node, code, load_binary, [Module, "nofile", Binary]),
ok.
spawn_remote_tracer(Node, Pattern, Pid) ->
inject_code(Node),
rpc:call(Node, ?MODULE, spawn_tracer, [Pattern, Pid, self()]).
spawn_tracer(Pattern, Pid, CallerPid) ->
spawn(fun() ->
link(CallerPid),
erlang:trace(all, true, [call]),
erlang:trace_pattern(Pattern, [], []),
tracer_cycle(Pid)
end).
tracer_cycle(Pid) ->
receive
Msg ->
Pid ! Msg,
?MODULE:tracer_cycle(Pid)
end.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment