Как улучшить отладку? - PullRequest
       9

Как улучшить отладку?

2 голосов
/ 08 февраля 2011

Отчет о сбое (SASL) дает более или менее информацию о том, где и почему произошла ошибка.Но возможно ли это уточнить (функция, код строки и т. Д.)?

Ответы [ 2 ]

2 голосов
/ 08 февраля 2011

В общем, нет.Erlang .beam-файлы не содержат номеров строк исходного кода, поэтому трудно определить, в какой строке возникла проблема.У меня есть несколько макросов, которые я использую в своем проекте, включая "log.hrl":

-define(INFO(T), error_logger:info_report(T)).
-define(WARN(T), error_logger:warning_report(
    [process_info(self(), current_function), {line, ?LINE} | T])).
-define(ERR(T), error_logger:error_report(
    [process_info(self(), current_function), {line, ?LINE} | T])).

-define(DEBUG(Format, Args), io:format("D(~p:~p:~p) : "++Format++"~n",
                                   [self(),?MODULE,?LINE]++Args)).
-define(DEBUGP(Args), io:format("D(~p:~p:~p) : ~p~n",
                                   [self(),?MODULE,?LINE, Args])).

, и это дает вам несколько строк журнала в программе для поиска.Для отладки я также часто использую инструмент redbug из набора eper :

https://github.com/massemanet/eper

Он позволяет отслеживать в режиме реального времени всякий раз, когдапроисходит звонок:

 Eshell V5.8.3  (abort with ^G)
 1> redbug:start("erlang:now() -> stack;return", [{time, 60*1000}]).
 ok
 2> erlang:now().
 {1297,183814,756227}

 17:50:14 <{erlang,apply,2}> {erlang,now,[]}
   shell:eval_loop/3 
   shell:eval_exprs/7 
   shell:exprs/7 

 17:50:14 <{erlang,apply,2}> {erlang,now,0} -> {1297,183814,756227}
 3> 

Надеюсь, это поможет.

2 голосов
/ 08 февраля 2011

Если вы можете воспроизвести ошибку, лучший способ получить больше информации - поместить трассировку dbg в рассматриваемые разделы и просмотреть полученные результаты.

dbg:tracer(),dbg:p(all,c),dbg:tpl(Mod,Func,x).

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

Если вы ищете более подробные записи после смерти, тогда sasl и error_logger - ваши друзья. Конечно, бывают случаи, когда SASL не дает вам достаточной информации, если в вашей системе это часто происходит, вам, вероятно, следует научиться лучше понимать вывод SASL или написать собственный обработчик журнала. Довольно просто подключить свой собственный обработчик ошибок в SASL и выводить данные по своему усмотрению.

Однако вы никогда не получите номер строки, поскольку эта информация уничтожается во время компиляции, и у ВМ нет возможности узнать, какая строка вылетела. Однако он знает, какую функцию и, возможно, с какими аргументами, учитывая это, обычно можно узнать, где что-то пошло не так. Если вы не пишете очень длинные функции, что, по мнению IMO, является неприятным запахом кода и признаком того, что вы должны рефакторировать свой код для более мелких функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...