5

我正在尝试使用 fprof 对我的软件进行更好的性能可视化。但是,默认值是使用挂钟测量的,但我想用 cpu 时间测量它。因此,我在 shell 上运行以下命令,但出现错误。在 Internet 或 erlang 文档中无法真正找到它失败的原因。有人有任何提示吗?

% fprof:trace([start, {cpu_time, true}]).
{error,not_supported}
4

2 回答 2

2

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 异常,则意味着您的平台不支持此功能。

于 2012-12-14T09:56:31.970 回答
1

以下代码来自文件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.
于 2012-11-30T21:27:45.643 回答