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

|| 我必须调试一些在参数中传递巨大二进制文件的代码。 为此,我想使用
dbg:tracer/0
dbg:p/2
dbg:tpl/3
的组合。 但是,如果执行此操作,则每次都会输出所有二进制文件,这会使输出一团糟,因此很难找到重要信息。 更糟糕的是,这些二进制文件的输出会弄乱代码的时序。这使得它的行为足够不同,以至于我无法重现我想I3的行为。 我仍然想查看其他参数,但不需要查看二进制文件(缩短二进制文件也可以)。     
已邀请:
        您可能要使用以下内容:
-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模块,以模拟其漂亮的打印效果(不幸的是,格式化功能未导出到那里)。     

要回复问题请先登录注册