2011-06-15 13 views
3

我必須調試一些在params中傳遞巨大二進制文件的代碼。使用dbg跟蹤時避免輸出巨大的二進制參數

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

但是,如果我這樣做,所有的二進制文件每次都會輸出,這會導致輸出混亂,所以重要的信息很難找到。

更糟的是,這些二進制文件的輸出擾亂了代碼的時間。這使得它的行爲足夠不同,我無法重現我想要的行爲dbg

我仍然想看到其他參數,但不需要看到二進制文件(縮短的二進制文件也可以)。

回答

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,[email protected],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模塊來模擬他們漂亮的打印(不幸的是,格式化函數沒有被導出)。