2011-02-08 76 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> 

我希望這有助於。