2. SASL错误记录 | 2. SASL Error Logging

2 SASL错误记录

SASL应用程序引入了三种类型的报告:

  • 主管报告

  • 进度报告

  • 坠机报告

启动SASL应用程序时,它会添加一个处理程序,按照SASL的配置参数(即SASL应用程序规范中的环境变量)中的指定格式和写入这些报告,在.appSASL文件。有关详细信息,请参阅sasl(6)适用于参考手册和app(4)文件在内核参考手册中。

2.1主管报告

当受监管的孩子意外终止时,会发出主管报告。主管报告包含以下内容:

Supervisor

报告主管的姓名。

Context

指示从主管的角度来看,孩子在哪个阶段结束。这可能是start_errorchild_terminatedshutdown_error

Reason

终止原因。

Offender

启动孩子的规格。

2.2进度报告

当主管启动或重新启动孩子时,将发布进度报告。进度报告载有下列项目:

Supervisor

报告主管的姓名。

Started

成功启动子程序的启动规范。

2.3坠机报告

进程开始于函数proc_lib:spawn或被proc_lib:spawn_link包装在一个catch。当这样的过程与一个意想不到的原因,这是比任何其他原因终止崩溃报告被发出normalshutdown{shutdown,Term}。使用行为的进程gen_servergen_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