我必须调试一些在参数中传递巨大二进制文件的代码。
为此,我想使用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:tracer
,它有两个参数。第一个是类型,可以是进程或端口(有关详细信息,请参阅文档)。第二个参数是一个消息处理函数(实际上是一个包含处理函数和初始处理数据的元组),它将为每个跟踪消息调用。
在那里,您可以实现您的逻辑来截断超过一定数量的二进制文件或您需要做的任何其他事情。
所以,你会得到类似的东西:
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 模块来模拟它们漂亮的打印(不幸的是,格式化函数没有在那里导出)。