fprof を使用して、ソフトウェアのパフォーマンスを視覚化しようとしています。ただし、デフォルトでは壁掛け時計で計測していますが、CPU時間で計測したいです。したがって、シェルで次のコマンドを実行しますが、エラーが発生します。インターネットまたは erlang のドキュメントで失敗する理由を実際に見つけることができませんでした。誰にもヒントはありますか?
% fprof:trace([start, {cpu_time, true}]).
{error,not_supported}
fprof の cpu_time フラグは、上記のコード スニペットに示すように、トレースの cpu_timestamp に変換されます。
http://erlang.org/doc/man/erlang.html#trace-3によると:
cpu_timestamp
すべてのトレース タイムスタンプをウォールクロックではなく CPU 時間にする、Erlang ノードのグローバル トレース フラグ。でのみ許可され
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.