From 95c6ccc2962d7d7ed9eb488fd99e974eb58f8ae8 Mon Sep 17 00:00:00 2001 From: SisMaker <1713699517@qq.com> Date: Wed, 2 Jun 2021 00:43:59 +0800 Subject: [PATCH] =?UTF-8?q?ft:=20=E4=BB=A3=E7=A0=81=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- c_src/tracer/tpTracerNif.c | 9 ++++-- include/eTpf.hrl | 5 ++- rebar.config | 16 ++++++++++ src/eTpf.erl | 32 +++++++------------ src/tracer/tpTracerFile.erl | 14 ++++---- src/tracer/tpTracerPool.erl | 25 --------------- ...{tpTracerConsole.erl => tpTracerShell.erl} | 9 ++++-- src/tracer/tpTracerSocket.erl | 6 ++-- 8 files changed, 52 insertions(+), 64 deletions(-) create mode 100644 rebar.config delete mode 100644 src/tracer/tpTracerPool.erl rename src/tracer/{tpTracerConsole.erl => tpTracerShell.erl} (91%) diff --git a/c_src/tracer/tpTracerNif.c b/c_src/tracer/tpTracerNif.c index 84f6171..343f5af 100644 --- a/c_src/tracer/tpTracerNif.c +++ b/c_src/tracer/tpTracerNif.c @@ -55,6 +55,7 @@ NIF_ATOMS(NIF_ATOM_DECL) static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info) { NIF_ATOMS(NIF_ATOM_INIT) + *priv_data = NULL; return 0; } @@ -68,6 +69,7 @@ static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_N static void unload(ErlNifEnv* env, void* priv_data) { + } // enabled(TraceTag, TracerState, Tracee) @@ -150,10 +152,13 @@ static ERL_NIF_TERM enabled_garbage_collection(ErlNifEnv *env, int argc, const E // trace(TraceTag, TracerState, Tracee, TraceTerm, Opts) static ERL_NIF_TERM trace(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) { - + enif_fprintf(stdout, "IMY************trace:"); for(int i = 0; i <= argc - 1; i++) { - enif_fprintf(stdout, "IMY************trace000 %T\n", argv[i]); + if(i != 1) { + enif_fprintf(stdout, " %d %T", i, argv[i]); + } } + enif_fprintf(stdout, "\n"); ERL_NIF_TERM tracers, head, ts, extra, mspec, msg; ErlNifPid tracer; diff --git a/include/eTpf.hrl b/include/eTpf.hrl index 86f5682..7bf745d 100644 --- a/include/eTpf.hrl +++ b/include/eTpf.hrl @@ -13,7 +13,7 @@ , tcmNestStruct => 6 }). --define(eTpfPoolId, eTpfPoolId). +-define(eTpfTracerId, eTpfTracerId). %% 类型声明 -export_type([input/0, userInput/0, traceOpts/0, tracerOpts/0]). @@ -27,8 +27,7 @@ -type traceOpts() :: #{ mode => trace | profile - , poolId => any() - , poolSize => pos_integer() + , tracerId => any() , send => boolean() , running => boolean() , process_dump => boolean() %% 必需的trace选项 为了生成火焰图,我们目前在跟踪时需要使用一个附加选项。此选项将导致将堆栈跟踪信息添加到调用事件。选项为`process_dump`, 并且必须将其设置为`true`。 diff --git a/rebar.config b/rebar.config new file mode 100644 index 0000000..55b25b3 --- /dev/null +++ b/rebar.config @@ -0,0 +1,16 @@ +{erl_opts, [debug_info]}. +{deps, [ + {eFmt, ".*", {git, "http://192.168.0.88:53000/SisMaker/eFmt.git", {branch, "master"}}}, + {eGbh, ".*", {git, "http://192.168.0.88:53000/SisMaker/eGbh.git", {branch, "master"}}} + +]}. + +{shell, [ + % {config, "config/sys.config"}, + {apps, [eTpf]} +]}. + +% {pre_hooks, +% [{"", compile, "escript c_src/eNpc compile"}]}. +% {post_hooks, +% [{"", clean, "escript c_src/eNpc clean"}]}. diff --git a/src/eTpf.erl b/src/eTpf.erl index 86d54f3..00cf000 100644 --- a/src/eTpf.erl +++ b/src/eTpf.erl @@ -15,7 +15,7 @@ -spec trace(userInput()) -> ok. trace(Input) -> - trace(Input, tpTracerConsole). + trace(Input, tpTracerShell). -spec trace(userInput(), module()) -> ok. trace(Input, TracerMod) -> @@ -33,23 +33,19 @@ trace(Input, TracerMod, TracerOpts, TraceOpts) when is_list(Input) -> do_trace(InputList, TracerMod, TracerOpts, TraceOpts) -> _ = application:ensure_all_started(eTpf), - %% Start the pool of tracer processes. - PoolID = maps:get(poolId, TraceOpts, ?eTpfPoolId), - PoolSize = maps:get(poolSize, TraceOpts, erlang:system_info(schedulers)), - true = PoolSize > 0, - {ok, PoolPid} = supervisor:start_child(eTpf_sup, #{ - id => PoolID, - start => {tpTracerPool, start_link, [PoolSize, TracerMod, TracerOpts]}, + TracerId = maps:get(tracerId, TraceOpts, ?eTpfTracerId), + {ok, TracerPid} = supervisor:start_child(eTpf_sup, #{ + id => TracerId, + start => {TracerMod, start_link, [TracerOpts]}, restart => temporary, - type => supervisor + type => worker }), - Tracers = tpTracerPool:tracers(PoolPid), - TracersMap = maps:from_list(lists:zip(lists:seq(0, length(Tracers) - 1), Tracers)), + Mode = maps:get(mode, TraceOpts, trace), Tem0InputList = flattenInput(InputList, []), Tem1InputList = ensurePattern(Tem0InputList), LastInputList = ensureScope(Tem1InputList), - traceInput(LastInputList, #{mode => Mode, tracers => TracersMap}, TraceOpts), + traceInput(LastInputList, {Mode, TracerPid}, TraceOpts), ok. flattenInput([], Acc) -> @@ -111,11 +107,7 @@ traceInput([Mod | Tail], TracerState, TraceOpts) when is_atom(Mod) -> traceInput(Tail, TracerState, TraceOpts). stop() -> - stop(?eTpfPoolId). - -%% @todo Confirm that we don't need to stop tracing, -%% that just terminating the tracers is enough. The -%% NIF does cancel traces when tracers go away, but -%% better make sure. -stop(PoolID) -> - supervisor:terminate_child(eTpf_sup, PoolID). + stop(?eTpfTracerId). + +stop(TracerId) -> + supervisor:terminate_child(eTpf_sup, TracerId). diff --git a/src/tracer/tpTracerFile.erl b/src/tracer/tpTracerFile.erl index c050c44..95ec3a6 100644 --- a/src/tracer/tpTracerFile.erl +++ b/src/tracer/tpTracerFile.erl @@ -2,8 +2,8 @@ -include("eTpf.hrl"). -export([ - start_link/2 - , init/3 + start_link/1 + , init/2 ]). %% sys callbacks @@ -26,17 +26,15 @@ , tcmIsCut = false }). -start_link(Nth, Prefix) when is_list(Prefix) -> - start_link(Nth, #{fBaseName => Prefix}); -start_link(Nth, Opts) when is_map(Opts) -> - Pid = proc_lib:spawn_link(?MODULE, init, [self(), Nth, Opts]), +start_link(Opts) -> + Pid = proc_lib:spawn_link(?MODULE, init, [self(), Opts]), {ok, Pid}. -init(Parent, Nth, TracerOpts) -> +init(Parent, TracerOpts) -> process_flag(message_queue_data, off_heap), process_flag(trap_exit, true), %% No need to close the file, it'll be closed when the process exits. - Filename = filename:flatten([maps:get(fBaseName, TracerOpts, "traces.lz4"), ".", integer_to_list(Nth)]), + Filename = maps:get(fBaseName, TracerOpts, "traces.lz4"), {ok, IoDevice} = file:open(Filename, [write, raw]), TcmIsCut = maps:get(tcmIsCut, TracerOpts, maps:get(tcmDepth, ?defTcmMap)), diff --git a/src/tracer/tpTracerPool.erl b/src/tracer/tpTracerPool.erl deleted file mode 100644 index f47cb99..0000000 --- a/src/tracer/tpTracerPool.erl +++ /dev/null @@ -1,25 +0,0 @@ --module(tpTracerPool). --behaviour(supervisor). - --export([ - start_link/3 - , init/1 - , tracers/1 -]). - -start_link(NumTracers, TracerMod, Opts) -> - supervisor:start_link(?MODULE, [NumTracers, TracerMod, Opts]). - -init([NumTracers, TracerMod, Opts]) -> - ChildSpecs = [ - #{ - id => {tracer, Index}, - start => {TracerMod, start_link, [Index, Opts]}, - restart => temporary - } || Index <- lists:seq(1, NumTracers) - ], - SupFlags = #{strategy => one_for_all, intensity => 5, period => 10}, - {ok, {SupFlags, ChildSpecs}}. - -tracers(PoolPid) -> - [Pid || {_, Pid, _, _} <- supervisor:which_children(PoolPid)]. diff --git a/src/tracer/tpTracerConsole.erl b/src/tracer/tpTracerShell.erl similarity index 91% rename from src/tracer/tpTracerConsole.erl rename to src/tracer/tpTracerShell.erl index 1658431..772c06e 100644 --- a/src/tracer/tpTracerConsole.erl +++ b/src/tracer/tpTracerShell.erl @@ -1,6 +1,9 @@ --module(tpTracerConsole). +-module(tpTracerShell). + +-export([ + start_link/1 +]). --export([start_link/2]). -export([ init/1 , loop/1 @@ -11,7 +14,7 @@ -export([system_terminate/4]). -export([system_code_change/4]). -start_link(_Nth, _TracerOpts) -> +start_link(_TracerOpts) -> Pid = proc_lib:spawn_link(?MODULE, init, [self()]), {ok, Pid}. diff --git a/src/tracer/tpTracerSocket.erl b/src/tracer/tpTracerSocket.erl index 78519c1..3d31288 100644 --- a/src/tracer/tpTracerSocket.erl +++ b/src/tracer/tpTracerSocket.erl @@ -1,7 +1,7 @@ -module(tpTracerSocket). -export([ - start_link/2 + start_link/1 , init/2 ]). @@ -18,9 +18,9 @@ timerRef :: reference() | undefined }). -start_link(Nth, TracerOpts) -> +start_link(TracerOpts) -> BasePort = maps:get(port, TracerOpts), - Pid = proc_lib:spawn_link(?MODULE, init, [self(), BasePort + Nth - 1]), + Pid = proc_lib:spawn_link(?MODULE, init, [self(), BasePort]), {ok, Pid}. init(Parent, Port) ->