檢視原始碼 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_error
、child_terminated
或shutdown_error
。Reason
- 終止原因。Offender
- 子程序的啟動規格。
進度報告
當監管者啟動或重新啟動子程序時,會發出進度報告。進度報告包含以下項目
Supervisor
- 報告監管者的名稱。Started
- 成功啟動的子程序的啟動規格。
崩潰報告
使用函式 proc_lib:spawn
或 proc_lib:spawn_link
啟動的程序會被包裹在 catch
內。當此類程序因意外原因終止時,會發出崩潰報告,該原因是指任何非 normal
、shutdown
或 {shutdown,Term}
的原因。使用行為 gen_server
、gen_fsm
或 gen_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