Erlang 使用dbg跟踪时避免输出巨大的二进制参数

Erlang 使用dbg跟踪时避免输出巨大的二进制参数,erlang,binaries,dbg,Erlang,Binaries,Dbg,我必须调试一些在参数中传递巨大二进制文件的代码 为此,我想结合使用dbg:tracer/0,dbg:p/2,dbg:tpl/3 但是如果我这样做,所有的二进制文件每次都会输出,这会把输出搞砸,所以很难找到重要的信息 更糟糕的是,这些二进制文件的输出扰乱了代码的计时。这使得它的行为完全不同,以至于我无法重现我想要的行为dbg 我仍然希望看到其他参数,但不需要看到二进制文件(缩短的二进制文件也可以)。您可能希望使用以下内容: -module(test). -compile(export_all).

我必须调试一些在参数中传递巨大二进制文件的代码

为此,我想结合使用
dbg:tracer/0
dbg:p/2
dbg:tpl/3

但是如果我这样做,所有的二进制文件每次都会输出,这会把输出搞砸,所以很难找到重要的信息

更糟糕的是,这些二进制文件的输出扰乱了代码的计时。这使得它的行为完全不同,以至于我无法重现我想要的行为
dbg


我仍然希望看到其他参数,但不需要看到二进制文件(缩短的二进制文件也可以)。

您可能希望使用以下内容:

-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模块以模拟其漂亮的打印(遗憾的是,格式化函数没有导出到那里)

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}