檢視原始碼 SASL 錯誤記錄

注意

本節描述的 SASL 錯誤記錄概念已在 Erlang/OTP 21.0 中棄用,當時引入了新的 記錄 API

新的預設行為是 SASL 應用程式不再影響記錄哪些日誌事件。監管者報告崩潰報告會透過 Kernel 設定的預設記錄器處理程式進行記錄。進度報告預設不會記錄,但可以透過將主要日誌等級設定為 info 來啟用,例如使用 Kernel 組態參數 logger_level

可以透過將 Kernel 組態參數 logger_sasl_compatible 設定為 true 來重新啟用舊的 SASL 錯誤記錄行為。

本節描述的 多檔案錯誤報告記錄機制也為了向後相容性而保留。然而,新的記錄 API 也引入了 logger_disk_log_h,這是一個可以使用 disk_log 列印到多個檔案的記錄器處理程式。

SASL 報告

SASL 應用程式引入了三種類型的報告

  • 監管者報告
  • 進度報告
  • 崩潰報告

當 SASL 應用程式啟動時,它會加入一個 Logger 處理程式,該處理程式會格式化並寫入這些報告,如 SASL 的組態參數中所指定。

監管者報告

當受監管的子程序意外終止時,會發出監管者報告。監管者報告包含以下項目

  • Supervisor - 報告監管者的名稱。

  • Context - 指示子程序從監管者的角度來看是在哪個階段終止的。這可能是 start_errorchild_terminatedshutdown_error

  • Reason - 終止原因。

  • Offender - 子程序的啟動規格。

進度報告

當監管者啟動或重新啟動子程序時,會發出進度報告。進度報告包含以下項目

  • Supervisor - 報告監管者的名稱。

  • Started - 成功啟動的子程序的啟動規格。

崩潰報告

使用函式 proc_lib:spawnproc_lib:spawn_link 啟動的程序會被包裹在 catch 內。當此類程序因意外原因終止時,會發出崩潰報告,該原因是指任何非 normalshutdown{shutdown,Term} 的原因。使用行為 gen_servergen_fsmgen_statem 的程序是此類程序的範例。崩潰報告包含以下項目

  • Crasher - 有關崩潰程序的資訊,例如初始函式呼叫、退出原因和訊息佇列。

  • Neighbours - 有關連結到崩潰程序且不捕獲退出的程序的資訊。這些程序是因這個程序崩潰而終止的鄰居。收集到的資訊與先前項目中描述的 Crasher 的資訊相同。

範例

以下範例顯示程序崩潰時產生的報告。範例程序是受 test_sup 監管者監管的 permanent 程序。執行除以零的操作,錯誤首先由故障程序報告。由於程序是使用函式 proc_lib:spawn/3 啟動的,因此會產生崩潰報告。監管者會產生監管者報告,顯示崩潰的程序。最後重新啟動程序時,會產生進度報告。

        =ERROR REPORT==== 27-May-1996::13:38:56 ===
        <0.63.0>: Divide by zero !

        =CRASH REPORT==== 27-May-1996::13:38:56 ===
        crasher:
        pid: <0.63.0>
        registered_name: []
        error_info: {badarith,{test,s,[]}}
        initial_call: {test,s,[]}
        ancestors: [test_sup,<0.46.0>]
        messages: []
        links: [<0.47.0>]
        dictionary: []
        trap_exit: false
        status: running
        heap_size: 128
        stack_size: 128
        reductions: 348
        neighbours:

        =SUPERVISOR REPORT==== 27-May-1996::13:38:56 ===
        Supervisor: {local,test_sup}
        Context:    child_terminated
        Reason:     {badarith,{test,s,[]}}
        Offender:   [{pid,<0.63.0>},
        {name,test},
        {mfa,{test,t,[]}},
        {restart_type,permanent},
        {shutdown,200},
        {child_type,worker}]

        =PROGRESS REPORT==== 27-May-1996::13:38:56 ===
        Supervisor: {local,test_sup}
        Started:  [{pid,<0.64.0>},
        {name,test},
        {mfa,{test,t,[]}},
        {restart_type,permanent},
        {shutdown,200},
        {child_type,worker}]

多檔案錯誤報告記錄

多檔案錯誤報告記錄用於儲存 error_logger 收到的錯誤訊息。錯誤訊息會儲存在多個檔案中,每個檔案都小於指定的千位元組數。同時存在的檔案數不會超過指定的數量。記錄速度非常快,因為每個錯誤訊息都寫成二進位術語。

如需更多詳細資訊,請參閱參考手冊中的 sasl(6) 應用程式。

報告瀏覽器

報告瀏覽器用於瀏覽和格式化由 STDLIB 中定義的錯誤記錄器處理程式 log_mf_h 寫入的錯誤報告。

log_mf_h 處理程式會將所有報告寫入報告記錄目錄,該目錄是在設定 SASL 應用程式時指定的。

如果報告瀏覽器離線使用,則可以將報告複製到啟動瀏覽器時指定的另一個目錄。如果沒有指定此類目錄,則瀏覽器會從 SASL error_logger_mf_dir 讀取報告。

啟動報告瀏覽器

使用函式 rb:start([Options]) 啟動 rb_server,如下列範例所示

        5> rb:start([{max, 20}]).
        rb: reading report...done.
        rb: reading report...done.
        rb: reading report...done.
        rb: reading report...done.
        {ok,<0.199.0>}

線上說明

輸入指令 rb:help() 以存取報告瀏覽器線上說明系統。

列出伺服器中的報告

使用函式 rb:list() 列出所有已載入的報告

        4> rb:list().
        No                Type          Process       Date     Time
        ==                ====          =======       ====     ====
        20            progress         <0.17.0> 1996-10-16 16:14:54
        19            progress         <0.14.0> 1996-10-16 16:14:55
        18               error         <0.15.0> 1996-10-16 16:15:02
        17            progress         <0.14.0> 1996-10-16 16:15:06
        16            progress         <0.38.0> 1996-10-16 16:15:12
        15            progress         <0.17.0> 1996-10-16 16:16:14
        14            progress         <0.17.0> 1996-10-16 16:16:14
        13            progress         <0.17.0> 1996-10-16 16:16:14
        12            progress         <0.14.0> 1996-10-16 16:16:14
        11               error         <0.17.0> 1996-10-16 16:16:21
        10               error         <0.17.0> 1996-10-16 16:16:21
        9        crash_report  release_handler 1996-10-16 16:16:21
        8   supervisor_report         <0.17.0> 1996-10-16 16:16:21
        7            progress         <0.17.0> 1996-10-16 16:16:21
        6            progress         <0.17.0> 1996-10-16 16:16:36
        5            progress         <0.17.0> 1996-10-16 16:16:36
        4            progress         <0.17.0> 1996-10-16 16:16:36
        3            progress         <0.14.0> 1996-10-16 16:16:36
        2               error         <0.15.0> 1996-10-16 16:17:04
        1            progress         <0.14.0> 1996-10-16 16:17:09
        ok

顯示報告

使用函式 rb:show(Number) 顯示特定報告的詳細資訊

7> rb:show(4).

PROGRESS REPORT  <0.20.0>                                   1996-10-16 16:16:36
===============================================================================
supervisor                                                     {local,sasl_sup}
started
[{pid,<0.24.0>},
{name,release_handler},
{mfa,{release_handler,start_link,[]}},
{restart_type,permanent},
{shutdown,2000},
{child_type,worker}]

ok
8> rb:show(9).

CRASH REPORT  <0.24.0>                                      1996-10-16 16:16:21
===============================================================================
Crashing process
pid                                                                 <0.24.0>
registered_name                                              release_handler
error_info                             {undef,{release_handler,mbj_func,[]}}
initial_call
{gen,init_it,
[gen_server,
<0.20.0>,
<0.20.0>,
{erlang,register},
release_handler,
release_handler,
[],
[]]}
ancestors                                                [sasl_sup,<0.18.0>]
messages                                                                  []
links                                                    [<0.23.0>,<0.20.0>]
dictionary                                                                []
trap_exit                                                              false
status                                                               running
heap_size                                                                610
stack_size                                                               142
reductions                                                                54

ok

搜尋報告

可以顯示所有包含共同模式的報告。假設程序因為嘗試呼叫不存在的函式 release_handler:mbj_func/1 而崩潰。然後可以如下所示顯示報告

12> rb:grep("mbj_func").
Found match in report number 11

ERROR REPORT  <0.24.0>                                      1996-10-16 16:16:21
===============================================================================

** undefined function: release_handler:mbj_func[] **
Found match in report number 10

ERROR REPORT  <0.24.0>                                      1996-10-16 16:16:21
===============================================================================

** Generic server release_handler terminating
** Last message in was {unpack_release,hej}
** When Server state == {state,[],
"/home/dup/otp2/otp_beam_sunos5_p1g_7",
[{release,
"OTP  APN 181 01",
"P1G",
undefined,
[],
permanent}],
undefined}
** Reason for termination ==
** {undef,{release_handler,mbj_func,[]}}
Found match in report number 9

CRASH REPORT  <0.24.0>                                      1996-10-16 16:16:21
===============================================================================
Crashing process
pid                                                                 <0.24.0>
registered_name                                              release_handler
error_info                             {undef,{release_handler,mbj_func,[]}}
initial_call
{gen,init_it,
[gen_server,
<0.20.0>,
<0.20.0>,
{erlang,register},
release_handler,
release_handler,
[],
[]]}
ancestors                                                [sasl_sup,<0.18.0>]
messages                                                                  []
links                                                    [<0.23.0>,<0.20.0>]
dictionary                                                                []
trap_exit                                                              false
status                                                               running
heap_size                                                                610
stack_size                                                               142
reductions                                                                54

Found match in report number 8

SUPERVISOR REPORT  <0.20.0>                                 1996-10-16 16:16:21
===============================================================================
Reporting supervisor                                           {local,sasl_sup}

Child process
errorContext                                                child_terminated
reason                                 {undef,{release_handler,mbj_func,[]}}
pid                                                                 <0.24.0>
name                                                         release_handler
start_function                               {release_handler,start_link,[]}
restart_type                                                       permanent
shutdown                                                                2000
child_type                                                            worker

ok

停止伺服器

使用函式 rb:stop() 停止 rb_server

13> rb:stop().
ok