查看源代码 tprof (tools v4.1.1)

进程跟踪分析工具

tprof 提供使用跟踪 BIF 进行 Erlang 进程分析的便捷助手。

警告

此模块旨在将 eprofcprof 替换为统一的 API,用于测量调用计数、时间和分配。它在 Erlang/OTP 27.0 中是实验性的。

可以分析调用次数、函数花费的时间以及函数进行的堆分配。分析可以临时进行,也可以在服务器辅助模式下运行,以便更深入地了解生产环境中运行的代码。服务器辅助模式可以使用默认的 tprof 服务器或通过 start(#{ session => atom() }) 启动的独立的 server/0运行。

此模块支持三种类型的分析

  • call_count
  • call_time
  • call_memory

默认是 call_count,它对性能的影响和内存占用最小,但不支持按进程分析。因此,以下所有示例都使用 call_memory,它测量堆分配,并提供更复杂的功能集来演示。

不适合单个机器字长的 Erlang 项会在进程堆上分配。例如,返回两个元素的元组的函数需要在进程堆上分配元组。实际消耗是三个字,因为运行时系统还需要一个额外的字来存储元组大小。

注意

启用分析时,程序的执行速度会降低。

为了方便分析,会对在某些跟踪模式中未启用的函数累积测量结果。考虑以下调用堆栈示例

top_traced_function(...)
not_traced_function()
bottom_traced_function()

not_traced_function 内发生的分配将添加到 top_traced_function 的分配中。但是,bottom_traced_function 内发生的分配不包括在 top_traced_function 中。要仅跟踪每个函数自己的分配,必须跟踪所有函数。

警告

避免热代码重载参与跟踪的模块。重新加载模块会禁用跟踪并丢弃累积的统计信息。当被分析的代码在分析会话期间重新加载时,tprof 的结果可能会不正确。

临时分析

临时分析对于分析单个函数调用很方便。

例如

1> tprof:profile(lists, seq, [1, 16], #{type => call_memory}).

****** Process <0.92.0>  --  100.00% of total *** 
FUNCTION          CALLS  WORDS  PER CALL  [     %]
lists:seq_loop/3      5     32      6.40  [100.00]
                            32            [ 100.0]
ok

默认情况下,会对所有模块中的所有函数启用跟踪。在交互式 shell 中创建 fun 时,也会跟踪部分 shell 代码

1> tprof:profile(fun() -> lists:seq(1, 16) end, #{type => call_memory}).

****** Process <0.95.0>  --  100.00% of total *** 
FUNCTION                   CALLS  WORDS  PER CALL  [    %]
erl_eval:do_apply/7            1      3      3.00  [ 3.61]
erl_eval:match_list/6          1      3      3.00  [ 3.61]
lists:reverse/1                1      4      4.00  [ 4.82]
erl_eval:expr_list/7           3      7      2.33  [ 8.43]
erl_eval:ret_expr/3            4     16      4.00  [19.28]
erl_eval:merge_bindings/4      3     18      6.00  [21.69]
lists:seq_loop/3               5     32      6.40  [38.55]
                                     83            [100.0]
ok

但是,可以将跟踪限制为特定的函数或模块

2> tprof:profile(fun() -> lists:seq(1, 16) end,
                 #{type => call_memory, pattern => [{lists, seq_loop, '_'}]}).
****** Process <0.98.0>  --  100.00% of total *** 
FUNCTION          CALLS  WORDS  PER CALL  [     %]
lists:seq_loop/3      5     32      6.40  [100.00]
                            32            [ 100.0]

ok

临时分析结果可以通过几种不同的方式打印。以下示例使用像这样定义的 test 模块

-module(test).
-export([test_spawn/0]).
test_spawn() ->
    {Pid, MRef} = spawn_monitor(fun () -> lists:seq(1, 32) end),
    receive
        {'DOWN', MRef, process, Pid, normal} ->
            done
    end.

默认情况下,显示每个进程的统计信息

1> tprof:profile(test, test_spawn, [], #{type => call_memory}).

****** Process <0.176.0>    -- 23.66 % of total allocations ***
FUNCTION                CALLS  WORDS  PER CALL  [    %]
erlang:spawn_monitor/1      1      2         2  [ 9.09]
erlang:spawn_opt/4          1      6         6  [27.27]
test:test_spawn/0           1     14        14  [63.64]
                                  22            [100.0]

****** Process <0.177.0>    -- 76.34 % of total allocations ***
FUNCTION           CALLS  WORDS  PER CALL  [    %]
erlang:apply/2         1      7         7  [ 9.86]
lists:seq_loop/3       9     64         7  [90.14]
                             71            [100.0]

以下示例打印所有进程的组合内存分配,按分配的总字数降序排序

2> tprof:profile(test, test_spawn, [],
                 #{type => call_memory, report => {total, {measurement, descending}}}).

FUNCTION                CALLS  WORDS  PER CALL  [    %]
lists:seq_loop/3            9     64         7  [68.82]
test:test_spawn/0           1     14        14  [15.05]
erlang:apply/2              1      7         7  [ 7.53]
erlang:spawn_opt/4          1      6         6  [ 6.45]
erlang:spawn_monitor/1      1      2         2  [ 2.15]
                                  93            [100.0]

也可以收集分析数据以供进一步检查

3> {done, ProfileData} = tprof:profile(fun test:test_spawn/0,
                                       #{type => call_memory, report => return}).
<...>
4> tprof:format(tprof:inspect(ProfileData, process, {percent, descending})).

****** Process <0.223.0>    -- 23.66 % of total allocations ***
FUNCTION                CALLS  WORDS  PER CALL  [    %]
test:test_spawn/0           1     14        14  [63.64]
erlang:spawn_opt/4          1      6         6  [27.27]
erlang:spawn_monitor/1      1      2         2  [ 9.09]
                                  22            [100.0]

****** Process <0.224.0>    -- 76.34 % of total allocations ***
FUNCTION           CALLS  WORDS  PER CALL  [    %]
lists:seq_loop/3       9     64         7  [90.14]
erlang:apply/2         1      7         7  [ 9.86]
                             71            [100.0]

分析的进程取决于分析类型。

  • call_count(默认)计算所有进程中的调用。

  • call_timecall_memory 将分析限制为从用户提供的函数生成的进程(使用 trace:process/4set_on_spawn 选项)。

call_timecall_memory 可以限制为分析单个进程

2> tprof:profile(test, test_spawn, [],
                 #{type => call_memory, set_on_spawn => false}).

****** Process <0.183.0>    -- 100.00 % of total allocations ***
FUNCTION                CALLS  WORDS  PER CALL  [    %]
erlang:spawn_monitor/1      1      2         2  [ 9.09]
erlang:spawn_opt/4          1      6         6  [27.27]
test:test_spawn/0           1     14        14  [63.64]

Erlang 程序可以在其他进程中执行昂贵的操作,而不是原始进程。在测量时间或内存时,您可以包含多个、新的甚至所有进程到跟踪中

7> pg:start_link().
{ok,<0.252.0>}
8> tprof:profile(fun() -> pg:join(group, self()) end,
                 #{type => call_memory, rootset => [pg]}).
****** Process <0.252.0>    -- 52.86 % of total allocations ***
FUNCTION                      CALLS  WORDS  PER CALL  [    %]
pg:leave_local_update_ets/5       1      2         2  [ 1.80]
gen:reply/2                       1      3         3  [ 2.70]
erlang:monitor/2                  1      3         3  [ 2.70]
gen_server:try_handle_call/4      1      3         3  [ 2.70]
gen_server:try_dispatch/4         1      3         3  [ 2.70]
maps:iterator/1                   2      4         2  [ 3.60]
maps:take/2                       1      6         6  [ 5.41]
pg:join_local_update_ets/5        1      8         8  [ 7.21]
pg:handle_info/2                  1      8         8  [ 7.21]
pg:handle_call/3                  1      9         9  [ 8.11]
gen_server:loop/7                 2      9         4  [ 8.11]
ets:lookup/2                      2     10         5  [ 9.01]
pg:join_local/3                   1     11        11  [ 9.91]
pg:notify_group/5                 2     16         8  [14.41]
erlang:setelement/3               2     16         8  [14.41]
                                       111            [100.0]

****** Process <0.255.0>    -- 47.14 % of total allocations ***
FUNCTION                   CALLS  WORDS  PER CALL  [    %]
erl_eval:match_list/6          1      3         3  [ 3.03]
erlang:monitor/2               1      3         3  [ 3.03]
lists:reverse/1                2      4         2  [ 4.04]
pg:join/3                      1      4         4  [ 4.04]
erl_eval:add_bindings/2        1      5         5  [ 5.05]
erl_eval:do_apply/7            2      6         3  [ 6.06]
gen:call/4                     1      8         8  [ 8.08]
erl_eval:expr_list/7           4     10         2  [10.10]
gen:do_call/4                  1     16        16  [16.16]
erl_eval:ret_expr/3            4     16         4  [16.16]
erl_eval:merge_bindings/4      3     24         8  [24.24]
                                     99            [100.0]

默认情况下,分析时间没有限制。对于临时分析,可以配置时间限制。如果分析的函数在该时间到期之前没有返回,则该进程将以原因 kill 终止。用户提供的函数启动的任何未链接的子进程都会保留;开发者有责任处理此类进程。

9> tprof:profile(timer, sleep, [100000], #{timeout => 1000}).

默认情况下,在任何时间点只允许一个临时或服务器辅助分析会话。可以强制同时进行多个临时会话,但开发者有责任确保跟踪模式不重叠

1> tprof:profile(fun() -> lists:seq(1, 32) end,
    #{registered => false, pattern => [{lists, '_', '_'}]}).

服务器辅助分析

服务器辅助分析可以在正在运行的系统上进行。为此,启动 tprof 服务器,然后在系统处理实际流量时添加要跟踪的跟踪模式和进程。可以随时提取、检查和打印数据。以下示例跟踪 Kernel supervisor 监督的所有进程的活动

1> tprof:start(#{type => call_memory}).
{ok,<0.200.0>}
2> tprof:enable_trace({all_children, kernel_sup}).
34
3> tprof:set_pattern('_', '_' , '_').
16728
4> Sample = tprof:collect().
{call_memory,
    [{gen_server,try_dispatch,4,[{<0.154.0>,2,6}]},
     {erlang,iolist_to_iovec,1,[{<0.161.0>,1,8}]},
<...>
5 > tprof:format(tprof:inspect(Sample)).

****** Process <0.154.0>    -- 14.21 % of total allocations ***
FUNCTION                   CALLS  WORDS  PER CALL  [    %]
maps:iterator/1                2      4         2  [15.38]
gen_server:try_dispatch/4      2      6         3  [23.08]
net_kernel:handle_info/2       2     16         8  [61.54]
                                     26            [100.0]

****** Process <0.161.0>    -- 85.79 % of total allocations ***
FUNCTION                        CALLS  WORDS  PER CALL  [    %]
disk_log:handle/2                   2      2         1  [ 1.27]
disk_log_1:maybe_start_timer/1      1      3         3  [ 1.91]
disk_log_1:mf_write_cache/1         1      3         3  [ 1.91]
<...>

可以分析整个运行系统,然后检查单个进程

1> tprof:start(#{type => call_memory}).
2> tprof:enable_trace(all), tprof:set_pattern('_', '_' , '_').
9041
3> timer:sleep(10000), tprof:disable_trace(all), Sample = tprof:collect().
{call_memory,
    [{user_drv,server,3,[{<0.64.0>,12,136}]},
     {user_drv,contains_ctrl_g_or_ctrl_c,1,[{<0.64.0>,80,10}]},
<...>
4> Inspected = tprof:inspect(Sample, process, measurement), Shell = maps:get(self(), Inspected).
{call_memory, 2743,
    [{shell,{enc,0},1,2,2,0.07291286912139992},
<...>
5> tprof:format(Shell).

FUNCTION                           CALLS  WORDS  PER CALL  [    %]
<...>
erl_lint:start/2                       2    300       150  [10.94]
shell:used_records/1                 114    342         3  [12.47]

总结

类型

用于排序的列 inspect/3profile/4

进程标识符 (pid) 或注册的进程名称。

指定 Module 的单个函数的检查数据。

临时分析器选项;请参阅 profile/4

单个进程的分析,或多个进程的组合分析,按选定的列排序。

tprof 服务器。

从跟踪 BIF 中提取的原始数据。

按模块名称分组的跟踪函数(及其 arity),如果跟踪所有代码,则为 all

用于启用所选进程分析的选项;请参阅 enable_trace/2

tprof 服务器将进行的分析类型。

函数

禁用与提供的模式匹配的跟踪函数。

返回当前跟踪映射的统计信息。

等效于 collect/0,但使用提供的 Server

恢复之前暂停的分析。

等效于 continue/0,但使用提供的 Server

停止累积指定进程的跟踪。

类似于 trace:process/4,但为了方便跟踪,支持更多选项。

等效于 enable_trace/2,但使用提供的 Server

格式化使用 inspect/3 转换的分析数据,输出到默认输出设备。

格式化使用 inspect/3 转换的分析数据,输出到设备 IoDevice

返回模块名称及其 arity 的函数映射。

等效于 get_trace_map/0,但使用提供的 Server

将跟踪 BIF 返回的原始数据转换为方便后续分析和格式化的形式。

暂停当前跟踪的所有函数的跟踪收集,保留现有跟踪。

等效于 pause/0,但使用提供的 Server

对调用 Fun() 进行临时分析。

对调用 apply(Module, Function, Args) 进行临时分析。

清除累积的分析,如果已暂停,则开始分析。

等效于 restart/0,但使用提供的 Server

启用与提供的模式匹配的所有函数的跟踪。

等效于 set_pattern/3,但使用提供的 Server

等效于 start(#{})

启动服务器,不进行监督。

等效于 start/1,但也会将分析服务器链接到调用者。

停止默认的 tprof 服务器并禁用服务器启用的跟踪。

等效于 stop/0,但使用提供的 Server

类型

此类型的链接

column()

查看源代码 (未导出) (自 OTP 27.0 起)
-type column() :: module | function | calls | measurement | measurement_per_call | percent.

用于排序的列 inspect/3profile/4

  • module - 模块名称。

  • function - 函数名称。

  • calls - 函数的调用次数。

  • measurement - 在所有函数调用中测量的总数(调用计数、时间或堆分配)。

  • measurement_per_call - 每次函数调用平均的测量值(调用计数、时间或堆分配)。

  • percent - 在整个分析收集期间,测量值占总量的百分比。

此类型的链接

process()

查看源代码 (未导出) (自 OTP 27.0 起)
-type process() :: pid() | atom().

进程标识符 (pid) 或注册的进程名称。

此类型的链接

profile_line()

查看源代码 (未导出) (自 OTP 27.0 起)
-type profile_line() ::
          {module(),
           Function :: {atom(), arity()},
           Count :: pos_integer(),
           Measurement :: pos_integer(),
           MeasurementPerCall :: non_neg_integer(),
           Percent :: float()}.

指定 Module 的单个函数的检查数据。

此类型的链接

profile_options()

查看源代码 (未导出) (自 OTP 27.0 起)
-type profile_options() ::
          #{type => trace_type(),
            timeout => timeout(),
            pattern => trace_pattern() | [trace_pattern()],
            set_on_spawn => boolean(),
            rootset => rootset(),
            report => return | process | total | {process, sort_by()} | {total, sort_by()},
            device => io:device()}.

临时分析器选项;请参阅 profile/4

此类型的链接

profile_result()

查看源代码 (未导出) (自 OTP 27.0 起)
-type profile_result() :: {trace_type(), TotalMeasurement :: non_neg_integer(), [profile_line()]}.

单个进程的分析,或多个进程的组合分析,按选定的列排序。

此类型的链接

rootset()

查看源代码 (未导出) (自 OTP 27.0 起)
-type rootset() :: [process()] | all | existing | new.
此类型的链接

server()

查看源代码 (未导出) (自 OTP 27.0 起)
-type server() :: pid() | tprof.

tprof 服务器。

每个服务器使用单独的 trace:session/0 以保持分析隔离。

此类型的链接

sort_by()

查看源代码 (未导出) (自 OTP 27.0 起)
-type sort_by() :: column() | {column(), ascending} | {column(), descending}.
此类型的链接

start_options()

查看源代码 (未导出) (自 OTP 27.0 起)
-type start_options() :: #{type => trace_type(), session => atom()}.
此类型的链接

trace_info()

查看源代码 (未导出) (自 OTP 27.0 起)
-type trace_info() ::
          {module(),
           Fun :: atom(),
           Arity :: non_neg_integer(),
           [{pid(), Count :: pos_integer(), Measurement :: pos_integer()}]}.

从跟踪 BIF 中提取的原始数据。

此类型的链接

trace_map()

查看源代码 (未导出) (自 OTP 27.0 起)
-type trace_map() :: #{module() => [{Fun :: atom(), arity()}]} | all.

按模块名称分组的跟踪函数(及其 arity),如果跟踪所有代码,则为 all

此类型的链接

trace_options()

查看源代码 (未导出) (自 OTP 27.0 起)
-type trace_options() :: #{set_on_spawn => boolean()}.

用于启用所选进程分析的选项;请参阅 enable_trace/2

此类型的链接

trace_pattern()

查看源代码 (未导出) (自 OTP 27.0 起)
-type trace_pattern() :: {module(), Fun :: atom(), arity() | '_'}.
此类型的链接

trace_type()

查看源代码 (未导出) (自 OTP 27.0 起)
-type trace_type() :: call_count | call_time | call_memory.

tprof 服务器将进行的分析类型。

  • call_count - 统计函数被调用的次数。这是一个全局分析事件,不能限制于特定的进程。有关更多详细信息,请参阅 call_count 中的 trace:function/4
  • call_time - 统计函数中花费的累积时间。有关更多详细信息,请参阅 call_time 中的 trace:function/4
  • call_memory - 统计函数中分配的累积内存。有关更多详细信息,请参阅 call_memory 中的 trace:function/4

函数

此函数的链接

clear_pattern(Mod, Fun, Arity)

查看源代码 (自 OTP 27.0 起)
-spec clear_pattern(module(), atom(), arity() | '_') -> ok.

禁用与提供的模式匹配的跟踪函数。

1> tprof:set_pattern(lists, seq, '_').
2
2> tprof:clear_pattern(lists, seq, 3).
1
3> tprof:get_trace_map().
#{lists => [{seq,2}]}

要求默认的 tprof 服务器已启动

此函数的链接

clear_pattern(Server, Mod, Fun, Arity)

查看源代码 (自 OTP 27.0 起)
-spec clear_pattern(server(), module(), atom(), arity() | '_') -> ok.

等效于 clear_pattern(Mod, Fun, Arity),但使用提供的 Server

此函数的链接

collect()

查看源代码 (自 OTP 27.0 起)
-spec collect() -> {trace_type(), [trace_info()]}.

返回当前跟踪映射的统计信息。

此函数的链接

collect(Server)

查看源代码 (自 OTP 27.0 起)
-spec collect(server()) -> {trace_type(), [trace_info()]}.

等效于 collect/0,但使用提供的 Server

此函数的链接

continue()

查看源代码 (自 OTP 27.0 起)
-spec continue() -> ok | not_paused.

恢复之前暂停的分析。

此函数的链接

continue(Server)

查看源代码 (自 OTP 27.0 起)
-spec continue(server()) -> ok | not_paused.

等效于 continue/0,但使用提供的 Server

此函数的链接

disable_trace(Rootset)

查看源代码 (自 OTP 27.0 起)
-spec disable_trace(Spec) -> non_neg_integer()
                       when Spec :: pid() | all | new | existing | {children | all_children, process()};
                   ([process()]) -> non_neg_integer() | {non_neg_integer(), [process()]}.

等效于 disable_trace(Spec, #{set_on_spawn => true})

此函数的链接

disable_trace(Spec, Options)

查看源代码 (自 OTP 27.0 起)
-spec disable_trace(Spec, trace_options()) -> non_neg_integer()
                       when Spec :: pid() | all | new | existing | {children | all_children, process()};
                   ([process()], trace_options()) ->
                       non_neg_integer() | {non_neg_integer(), [process()]}.

停止累积指定进程的跟踪。

有关选项的描述,请参阅 enable_trace/2

在从跟踪列表中删除进程之前累积的分析数据将被保留。这使得可以为系统中的许多或所有进程启用跟踪,休眠一小段时间,然后禁用所有进程的跟踪(以避免系统过载),但保留分析数据。

此函数的链接

disable_trace(Server, Spec, Options)

查看源代码 (自 OTP 27.0 起)
-spec disable_trace(server(), Spec, trace_options()) -> non_neg_integer()
                       when Spec :: pid() | all | new | existing | {children | all_children, process()};
                   (server(), [process()], trace_options()) ->
                       non_neg_integer() | {non_neg_integer(), [process()]}.
此函数的链接

enable_trace(Rootset)

查看源代码 (自 OTP 27.0 起)
-spec enable_trace(Spec) -> non_neg_integer()
                      when Spec :: pid() | all | new | existing | {children | all_children, process()};
                  ([process()]) -> non_neg_integer() | {non_neg_integer(), [process()]}.

等效于 enable_trace(Spec, #{set_on_spawn => true})

此函数的链接

enable_trace(Spec, Options)

查看源代码 (自 OTP 27.0 起)
-spec enable_trace(Spec, trace_options()) -> Traced :: non_neg_integer()
                      when Spec :: pid() | all | new | existing;
                  (Spec, trace_options()) ->
                      Traced :: non_neg_integer() | {Traced :: non_neg_integer(), Failed :: [process()]}
                      when Spec :: [process()] | {children | all_children, process()}.

类似于 trace:process/4,但为了方便跟踪,支持更多选项。

call_count 分析器不支持按进程跟踪。

Spec 是本地进程的进程标识符 (pid)、以下原子之一,或本地进程标识符或其注册名称的列表

  • all - 所有当前存在的进程以及将来将创建的所有进程。

  • existing - 所有当前存在的进程。

  • new - 将来创建的所有进程。

  • children - 所有当前正在运行的、由指定进程直接派生的进程。此模式有助于跟踪单个主管的工作进程。

  • all_children - 所有当前正在运行的、由指定进程派生的进程,或其任何递归后代。此模式旨在方便跟踪监管树。

返回已启用跟踪的进程数。

当使用 pid 列表、childrenall_children 时,也会返回未能启用跟踪的进程。如果进程在启用跟踪之前已终止,则可能无法启用跟踪。

注意

分析服务器不跟踪添加到跟踪集中的进程。允许停止分析服务器(清除任何累积的数据),重新启动服务器,设置完全不同的跟踪模式,同时保留跟踪进程列表以供将来使用。使用 disable_trace(Processes) 清除跟踪的进程列表。

指定 Options 以修改跟踪行为

  • set_on_spawn - 自动开始跟踪由跟踪进程派生的进程。默认启用。
此函数的链接

enable_trace(Server, Spec, Options)

查看源代码 (自 OTP 27.0 起)
-spec enable_trace(server(), Spec, trace_options()) -> non_neg_integer()
                      when Spec :: pid() | all | new | existing | {children | all_children, process()};
                  (server(), [process()], trace_options()) ->
                      non_neg_integer() | {non_neg_integer(), [process()]}.

等效于 enable_trace/2,但使用提供的 Server

此函数的链接

format(Inspected)

查看源代码 (自 OTP 27.0 起)
-spec format(profile_result() | #{pid() | all => profile_result()}) -> ok.

格式化使用 inspect/3 转换的分析数据,输出到默认输出设备。

此函数的链接

format(IoDevice, Inspected)

查看源代码 (自 OTP 27.0 起)
-spec format(io:device(), profile_result() | #{pid() | all => profile_result()}) -> ok.

格式化使用 inspect/3 转换的分析数据,输出到设备 IoDevice

此函数的链接

get_trace_map()

查看源代码 (自 OTP 27.0 起)
-spec get_trace_map() -> trace_map().

返回模块名称及其 arity 的函数映射。

此函数的链接

get_trace_map(Server)

查看源代码 (自 OTP 27.0 起)
-spec get_trace_map(server()) -> trace_map().

等效于 get_trace_map/0,但使用提供的 Server

此函数的链接

inspect(Profile)

查看源代码 (自 OTP 27.0 起)
-spec inspect({trace_type(), [trace_info()]}) -> #{all => profile_result()}.

等效于 inspect(Profile, process, percent)

将原始分析转换为一个从进程标识符到元组的映射,其中包含分配的字总数和按分配百分比升序排列的所有跟踪函数的列表。

此函数的链接

inspect(Profile, Type, SortBy)

查看源代码 (自 OTP 27.0 起)
-spec inspect(Profile :: {trace_type(), [trace_info()]}, Type :: process | total, SortBy :: sort_by()) ->
                 #{pid() | all => profile_result()}.

将跟踪 BIF 返回的原始数据转换为方便后续分析和格式化的形式。

  • Type 参数为 process 时,此函数返回一个进程标识符的映射,其中包含按所选列排序的相应分析结果。

  • Type 参数为 total 或通过 call_count 进行分析时,此函数返回一个带有单个 all 键的映射,其中包含所有进程的分析结果。

可以利用检查的分析数据来打印分析结果

此函数的链接

pause()

查看源代码 (自 OTP 27.0 起)
-spec pause() -> ok | not_running.

暂停当前跟踪的所有函数的跟踪收集,保留现有跟踪。

使用 continue/0 恢复跟踪收集。

此函数的链接

pause(Server)

查看源代码 (自 OTP 27.0 起)
-spec pause(server()) -> ok | not_running.

等效于 pause/0,但使用提供的 Server

此函数的链接

profile(Fun)

查看源代码 (自 OTP 27.0 起)
-spec profile(fun(() -> term())) -> ok | {term(), [trace_info()]}.

等效于 profile(Fun, #{})

此函数的链接

profile(Fun, Options)

查看源代码 (自 OTP 27.0 起)
-spec profile(fun(() -> term()), profile_options()) -> ok | {term(), {trace_type(), [trace_info()]}}.

对调用 Fun() 进行临时分析。

默认情况下,结果会格式化输出到设备;使用 report 选项可以更改此行为。

临时分析会启动一个新的 tprof 服务器实例,运行分析例程,提取结果,然后关闭服务器。

有关支持的选项列表,请参阅 profile/4

此函数的链接

profile(Module, Function, Args)

查看源码 (自 OTP 27.0 起)
-spec profile(module(), Fun :: atom(), Args :: [term()]) ->
                 ok | {term(), {trace_type(), [trace_info()]}}.

等效于 profile(Module, Function, Args, #{})

此函数的链接

profile(Module, Function, Args, Options)

查看源码 (自 OTP 27.0 起)
-spec profile(module(), Fun :: atom(), Args :: [term()], profile_options()) ->
                 ok | {term(), {trace_type(), [trace_info()]}}.

对调用 apply(Module, Function, Args) 进行临时分析。

默认情况下,结果会格式化输出到设备;使用 report 选项可以更改此行为。

临时分析会启动一个新的 tprof 服务器实例,运行分析例程,提取结果,然后关闭服务器。

临时分析器支持以下 Options

  • type - 要执行的分析类型。

  • device - 指定将分析结果打印到的 I/O 设备。可用于将文本输出重定向到控制台或 standard_error

  • pattern - 指定要启用的跟踪模式,或跟踪模式列表。默认情况下,所有函数 ({'_', '_', '_'}) 都会被跟踪。

  • report - 控制输出格式。默认值为 process;按总分配的百分比排序打印每个进程的分析数据。指定 report => return 来禁止打印并获取原始数据,以便使用 inspect/3 进行进一步评估,并使用 format/2 进行格式化。

  • rootset - 在跟踪列表中包含额外的进程。可用于分析 gen_server 的分配,或由进程间通信引起的其他分配。请参阅 此示例

  • set_on_spawn - 自动开始跟踪被跟踪进程生成的进程。默认启用。

  • timeout - 在指定的时间量(毫秒)后终止分析。

此函数的链接

restart()

查看源码 (自 OTP 27.0 起)
-spec restart() -> ok.

清除累积的分析,如果已暂停,则开始分析。

此函数的链接

restart(Server)

查看源码 (自 OTP 27.0 起)
-spec restart(server()) -> ok.

等效于 restart/0,但使用提供的 Server

此函数的链接

set_pattern(Mod, Fun, Arity)

查看源码 (自 OTP 27.0 起)
-spec set_pattern(module(), atom(), arity() | '_') -> ok | {error, {trace_pattern, trace_pattern()}}.

启用与提供的模式匹配的所有函数的跟踪。

模式是累加的,遵循与 trace:function/4 相同的规则。返回与提供的模式匹配的函数数量。

1> tprof:set_pattern(lists, seq, '_').
2
2> tprof:set_pattern(lists, keyfind, 3).
1
3> tprof:get_trace_map().
#{lists => [{keyfind,3},{seq,2},{seq,3}]}

如果没有函数与模式匹配,则会返回一个 error 元组

> tprof:set_pattern(no_module, func, '_').
{error,{trace_pattern,no_module,func,'_'}}

要求默认的 tprof 服务器已启动

此函数的链接

set_pattern(Server, Mod, Fun, Arity)

查看源码 (自 OTP 27.0 起)
-spec set_pattern(server(), module(), atom(), arity() | '_') ->
                     ok | {error, {trace_pattern, trace_pattern()}}.

等效于 set_pattern/3,但使用提供的 Server

此函数的链接

start()

查看源码 (自 OTP 27.0 起)
-spec start() -> {ok, Server} | {error, Reason}
               when Server :: server(), Reason :: {already_started, pid()}.

等效于 start(#{})

此函数的链接

start(Config)

查看源码 (自 OTP 27.0 起)
-spec start(Config :: start_options()) -> {ok, Server} | {error, Reason}
               when Server :: server(), Reason :: {already_started, pid()}.

启动服务器,不进行监督。

分析服务器存储当前的跟踪模式,并拥有用于分析的 跟踪会话

如果 Config 中没有提供 session,则会使用名为 tprof 的默认会话,并且分析服务器会 注册tprof

如果 Config 中提供了 session,则会创建具有该名称的会话,并且所有分析都在该会话中完成。在这种情况下,分析服务器不会 注册。当像这样使用 tprof 时,需要将此函数返回的 pid/0 提供给此模块中的函数。

此函数的链接

start_link()

查看源码 (自 OTP 27.0 起)
-spec start_link() -> {ok, Server} | {error, Reason}
                    when Server :: server(), Reason :: {already_started, pid()}.

等效于 start_link(#{})

此函数的链接

start_link(Config)

查看源码 (自 OTP 27.0 起)
-spec start_link(Config :: start_options()) -> {ok, Server} | {error, Reason}
                    when Server :: server(), Reason :: {already_started, pid()}.

等效于 start/1,但也会将分析服务器链接到调用者。

此函数的链接

stop()

查看源码 (自 OTP 27.0 起)
-spec stop() -> ok.

停止默认的 tprof 服务器并禁用服务器启用的跟踪。

此函数的链接

stop(Server)

查看源码 (自 OTP 27.0 起)
-spec stop(server()) -> ok.

等效于 stop/0,但使用提供的 Server