Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Erlang 如何优化调试?_Erlang - Fatal编程技术网

Erlang 如何优化调试?

Erlang 如何优化调试?,erlang,Erlang,崩溃报告(SASL)或多或少地给出了错误发生的位置和原因。 但是是否有可能对其进行细化(函数、行de代码等)?如果可以重现故障,获取更多信息的最佳方法是在有问题的部分上放置dbg跟踪并查看该输出 dbg:tracer(),dbg:p(all,c),dbg:tpl(Mod,Func,x). 这对我来说通常很管用。用您想要调试的任何模块和函数替换Mod和Func 如果您正在寻找更详细的事后日志记录,那么sasl和错误日志记录器是您的朋友。当然,有时SASL不能提供足够的信息,如果这种情况在您的系统

崩溃报告(SASL)或多或少地给出了错误发生的位置和原因。
但是是否有可能对其进行细化(函数、行de代码等)?

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

dbg:tracer(),dbg:p(all,c),dbg:tpl(Mod,Func,x).
这对我来说通常很管用。用您想要调试的任何模块和函数替换Mod和Func

如果您正在寻找更详细的事后日志记录,那么sasl和错误日志记录器是您的朋友。当然,有时SASL不能提供足够的信息,如果这种情况在您的系统中经常发生,您可能应该学习更好地理解SASL输出,或者编写自己的日志处理程序。将您自己的错误处理程序插入SASL并输出您想要的内容是非常容易的


然而,您永远不会得到行号,因为该信息在编译时被销毁,并且VM无法知道哪一行崩溃。然而,它确实知道哪个函数,可能有哪些参数,因此通常可以找出哪里出了问题。除非您编写很长的函数,否则这是一种糟糕的代码味道,是您应该将代码重构为更小的函数的标志

通常不会。erlang.beam文件不包含原始代码中的行号,因此很难知道问题发生在哪一行。我在我的项目中使用了许多宏,包括
“log.hrl”

这会在程序中给你一些日志行来搜索。对于调试,我还经常使用eper套件中的redbug工具:

它允许您在呼叫发生时实时跟踪:

 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> 
Eshell V5.8.3(使用^G中止)
1> redbug:start(“erlang:now()->stack;return”,[{time,60*1000}])。
好啊
2> erlang:now()。
{1297,183814,756227}
17:50:14{erlang,现在,[]}
外壳:评估回路/3
外壳:eval_exprs/7
外壳:exprs/7
17:50:14{erlang,现在,0}->{1297183814756227}
3> 

我希望这能有所帮助。

如果崩溃报告给出错误发生的位置和原因,那就太好了。不幸的是,它们会告诉您它崩溃的位置和原因,有时这与错误发生的位置和原因无关:(可以向我们提供一个崩溃报告示例?如何调试我们怀疑有问题的部分代码?可以,但通常会将其输入erlang shell。请注意,这些函数仅用于调试,不用于日志记录。它们会中断代码的最后一次调用优化,因此如果长时间打开可能会导致VM耗尽。)内存。刚刚意识到,您不能将其放入正在调试的实际函数中。它需要在运行代码之前执行,因此如果您想将其放入代码中,请在应用程序启动时或类似的地方执行。不过,在erlang shell中发出它是首选方法,除非您正在调试启动行为我试过了,但是当我用application:start(myAppli)从一个IDE启动我的应用程序时,我不知道结果在哪里可见(在SASL日志中?),它们是在stdio中输出的,我不知道Eclipse将如何工作(我假设您正在使用它?)。我的猜测是vlad可能必须对erlang节点的io做一些奇怪的事情,才能将其集成到Eclipse中。您必须查看IDE的文档,了解如何在其中进行调试,因为我对Eclipse(或任何其他IDE)的操作知之甚少如果你不小心dbg的追踪器,你可以用软管将系统完全冲洗干净——如果是生产的话,这是很糟糕的。
 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>