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}