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

时间:2011-06-15 16:42:35

标签: erlang binaries dbg

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

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

但是,如果我这样做,所有二进制文件每次输出都会导致输出混乱,因此重要的信息很难找到。

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

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

1 个答案:

答案 0 :(得分: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的替代版本,它有两个参数。第一种是类型,可以是进程端口(有关详细信息,请参阅doc)。第二个参数是消息处理函数(实际上是包含处理函数和初始处理程序数据的元组),将为每个跟踪消息调用它。

在那里,你可以实现你的逻辑来截断超过一定数量的二进制文件或你需要做的任何其他事情。

所以,你会得到类似的东西:

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