Как избежать вывода огромных двоичных параметров при трассировке с помощью dbg - PullRequest
3 голосов
/ 15 июня 2011

Мне нужно отладить некоторый код, который обходит огромные двоичные файлы в параметрах.

Для этого я хочу использовать комбинацию dbg:tracer/0, dbg:p/2, dbg:tpl/3.

Но если я сделаю это, все двоичные файлы будут выводиться каждый раз, что приводит к неправильному выводу, поэтому трудно найти важную информацию.

Что еще хуже, выходные данные этих двоичных файлов портят синхронизацию временикод.Из-за этого он ведет себя настолько по-другому, что я не могу воспроизвести желаемое поведение dbg.

Я все еще хочу увидеть другие параметры, но не нужно видеть двоичные файлы (сокращенные двоичные файлы также будуток).

1 Ответ

3 голосов
/ 16 июня 2011

Возможно, вы захотите использовать что-то вроде этого:

-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, которая принимает два аргумента. Первым является тип и может быть process или port (более подробную информацию см. В документе). Второй параметр - это функция обработчика сообщений (фактически, кортеж, содержащий функцию обработчика и начальные данные обработчика), которая будет вызываться для каждого сообщения трассировки.

Там вы можете реализовать свою логику для усечения двоичных файлов более длинных, чем определенное количество или все, что вам нужно сделать.

Итак, вы получите что-то вроде:

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, чтобы эмулировать их красивую печать (к сожалению, функции форматирования там не экспортируются).

...