微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决使用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,NewA});       
            ({trace,return_from,A},R},_) ->
             erlang:display({Pid,\"<-\",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,[<<2 bytes>>,b]}
{<0.45.0>,2,ok}
4> test:foo(<<\"aaaaaaa\">>,b).
ok
5> {<0.45.0>,[<<5 bytes>>,ok}
6> test:foo(<<\"aaaaaaasdaaaaaaaaa\">>,b).
ok
7> {<0.45.0>,ok}
您可能还想截断返回值。您还可以查看dbg模块,以模拟其漂亮的打印效果(不幸的是,格式化功能未导出到那里)。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。