我正在尝试使用 fprof 对我的软件进行更好的性能可视化。但是,默认值是使用挂钟测量的,但我想用 cpu 时间测量它。因此,我在 shell 上运行以下命令,但出现错误。在 Internet 或 erlang 文档中无法真正找到它失败的原因。有人有任何提示吗?
% fprof:trace([start, {cpu_time, true}]).
{error,not_supported}
fprof 的 cpu_time 标志被转换为 trace 的 cpu_timestamp,如上面的代码片段所示:
根据http://erlang.org/doc/man/erlang.html#trace-3:
cpu_timestamp
Erlang 节点的全局跟踪标志,使所有跟踪时间戳都在 CPU 时间,而不是挂钟。仅允许使用
PidSpec==all
. 如果主机操作系统不支持高分辨率 CPU 时间测量,trace/3
则以badarg
.
因此,如果调用erlang:trace(all, true, [cpu_timestamp])
返回 badarg 异常,则意味着您的平台不支持此功能。
以下代码来自文件fprof.erl
,它显示了错误消息的来源。但我不知道如何继续查找erlang:trace
. 它可以由 c 编写。如果能找到trace的源代码,就可以揭开这个秘密。
trace_on(Procs, Tracer, {V, CT}) ->
case case CT of
cpu_time ->
try erlang:trace(all, true, [cpu_timestamp]) of _ -> ok
catch
error:badarg -> {error, not_supported} %% above error message is shown here
end;
wallclock -> ok
end
of ok ->
MatchSpec = [{'_', [], [{message, {{cp, {caller}}}}]}],
erlang:trace_pattern(on_load, MatchSpec, [local]),
erlang:trace_pattern({'_', '_', '_'}, MatchSpec, [local]),
lists:foreach(
fun (P) ->
erlang:trace(P, true, [{tracer, Tracer} | trace_flags(V)])
end,
Procs),
ok;
Error ->
Error
end.