3

params で巨大なバイナリを渡すコードをデバッグする必要があります。

このためにdbg:tracer/0、 、dbg:p/2、の組み合わせを使用したいと思いdbg:tpl/3ます。

しかし、これを行うと、すべてのバイナリが毎回出力されるため、出力が台無しになるため、重要な情報を見つけるのが難しくなります。

さらに悪いことに、これらのバイナリの出力はコードのタイミングを台無しにします。これにより、必要な動作を再現できないほど十分に異なる動作になりdbgます。

私はまだ他のパラメーターを見たいと思っていますが、バイナリを見る必要はありません (短縮されたバイナリも問題ありません)。

4

1 に答える 1

3

次のようなものを使用したい場合があります。

-module(test).

-compile(export_all).

foo(_LongBinary, _OtherParam) ->
    ok.

test() ->
    dbg:tracer(process, {
         fun({trace, Pid, call, {M,F,A}}, _) ->
             NewA = lists:map(fun(<<Reduced:5/binary, _/binary>>) ->
                          Reduced;
                         (Else) ->
                          Else
                      end, A),
             erlang:display({Pid, "->", M, F, NewA});       
            ({trace, Pid, return_from, {M,F,A}, R}, _) ->
             erlang:display({Pid, "<-", M, F, A, R})        
         end, unused}),
    dbg:p(all,c),
    dbg:tpl(test, foo, x).

dbg:tracer主に、 2 つの引数を取るの代替バージョンを使用しています。1 つ目はタイプで、プロセスまたはポートの可能性があります(詳細については、ドキュメントを参照してください)。2 番目のパラメーターは、各トレース メッセージに対して呼び出されるメッセージ ハンドラー関数 (実際には、ハンドラー関数と初期ハンドラー データを含むタプル) です。

そこでは、ロジックを実装して、特定の量よりも長いバイナリを切り捨てるか、その他必要なことを行うことができます。

したがって、次のようなものが得られます。

1> test:test().                               
{ok,[{matched,nonode@nohost,1},{saved,x}]}
2> test:foo(<<"aa">>,b).                      
ok
3> {<0.45.0>,"->",test,foo,[<<2 bytes>>,b]}
{<0.45.0>,"<-",test,foo,2,ok}
4> test:foo(<<"aaaaaaa">>,b).
ok
5> {<0.45.0>,"->",test,foo,[<<5 bytes>>,b]}
{<0.45.0>,"<-",test,foo,2,ok}
6> test:foo(<<"aaaaaaasdaaaaaaaaa">>,b).
ok
7> {<0.45.0>,"->",test,foo,[<<5 bytes>>,b]}
{<0.45.0>,"<-",test,foo,2,ok}

戻り値も切り捨てることができます。dbg モジュールを調べて、きれいな印刷をエミュレートすることもできます (残念ながら、フォーマット関数はそこでエクスポートされません)。

于 2011-06-15T22:36:47.670 に答える