2011-02-08 31 views
2

崩溃报告(SASL)给出了或多或少的错误发生的位置和原因。 但是有可能对此进行细化(函数,行代码等)?如何优化调试?

+0

如果崩溃报告给出了错误发生的位置和原因,那将会很好。不幸的是,他们给你的地方,为什么它坠毁,有时没有什么可以做的地方,为什么发生了错误:( – 2011-02-08 15:15:26

+0

可以提供我们的示例崩溃报告? – 2011-02-08 16:00:49

回答

2

如果您可以重现故障,获取更多信息的最佳方式是在有问题的部分上放置dbg跟踪并查看该输出。

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

这通常对我来说是诀窍。用你想调试的任何模块和函数替换Mod和Func。

如果您正在寻找更详细的验尸日志,那么sasl和error_logger是您的朋友。当然有些时候SASL没有给你足够的信息,如果你的系统中发生了这么多事情,你可能应该学会更好地理解SASL输出或者编写你自己的日志处理程序。将自己的错误处理程序插入SASL并根据需要输出内容很容易。

但是,您将永远不会收到行号,因为该信息在编译时被销毁,虚拟机无法知道哪条行崩溃。但它确实知道哪个函数以及哪些参数可能与哪些参数相关,因此通常可以找出问题出在哪里。除非你编写很长的函数,哪个IMO是不好的代码味道,并且你应该将代码重构为更小的函数。

2

一般来说,没有。 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])). 

,这确实让你在程序中去寻找一些日志行。为了调试我也经常从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> 

我希望这有助于。