5

fprof を使用して、ソフトウェアのパフォーマンスを視覚化しようとしています。ただし、デフォルトでは壁掛け時計で計測していますが、CPU時間で計測したいです。したがって、シェルで次のコマンドを実行しますが、エラーが発生します。インターネットまたは erlang のドキュメントで失敗する理由を実際に見つけることができませんでした。誰にもヒントはありますか?

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

2 に答える 2

2

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 例外が返された場合は、この機能がプラットフォームでサポートされていないことを意味します。

于 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 に答える