2. SASL错误记录 | 2. SASL Error Logging
2 SASL错误记录
SASL应用程序引入了三种类型的报告:
- 主管报告
- 进度报告
- 坠机报告
启动SASL应用程序时,它会添加一个处理程序,按照SASL的配置参数(即SASL应用程序规范中的环境变量)中的指定格式和写入这些报告,在.app
SASL文件。有关详细信息,请参阅sasl(6)
适用于参考手册和app(4)
文件在内核参考手册中。
2.1主管报告
当受监管的孩子意外终止时,会发出主管报告。主管报告包含以下内容:
Supervisor
报告主管的姓名。
Context
指示从主管的角度来看,孩子在哪个阶段结束。这可能是start_error
,child_terminated
或shutdown_error
。
Reason
终止原因。
Offender
启动孩子的规格。
2.2进度报告
当主管启动或重新启动孩子时,将发布进度报告。进度报告载有下列项目:
Supervisor
报告主管的姓名。
Started
成功启动子程序的启动规范。
2.3坠机报告
进程开始于函数proc_lib:spawn
或被proc_lib:spawn_link
包装在一个catch
。当这样的过程与一个意想不到的原因,这是比任何其他原因终止崩溃报告被发出normal
,shutdown
或{shutdown,Term}
。使用行为的进程gen_server
,gen_fsm
或者gen_statem
是这样的进程的例子。崩溃报告包含以下项目:
Crasher
有关崩溃过程的信息,如初始函数调用、退出原因和消息队列。
Neighbours
有关链接到崩溃进程且不捕获退出的进程的信息。这些进程是由于进程崩溃而终止的邻居。收集到的信息与上一项中描述的Crasher信息相同。
例
下面的示例显示进程崩溃时生成的报告。示例过程是permanent
进程由test_sup
主管。执行除以零,错误过程首先报告错误。当进程使用函数启动时,将生成崩溃报告。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}]
2.4多文件错误报告日志记录
多文件错误报告日志记录用于存储由error_logger
错误消息存储在多个文件中,每个文件都小于指定的千字节数。同时存在的文件不超过指定数量。日志记录非常快,因为每个错误消息都是以二进制术语编写的。
有关详细信息,请参阅sasl(6)
适用于参考手册。
2.5报表浏览器
报表浏览器用于浏览和格式化错误记录器处理程序编写的错误报告。log_mf_h
在STDLIB中定义。
大log_mf_h
处理程序将所有报告写入报表日志目录,该目录是在配置SASL应用程序时指定的。
如果报表浏览器脱机使用,则可以将报表复制到启动浏览器时指定的另一个目录。如果没有指定这样的目录,浏览器将从SASL读取报告error_logger_mf_dir
。
启动报表浏览器
启动rb_server
有功能rb:start([Options])
如以下示例所示:
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