【问题标题】:How to make sure to get error_logger reports with line numbers on process crashes如何确保在进程崩溃时获得带有行号的 error_logger 报告
【发布时间】:2026-01-19 19:50:02
【问题描述】:

如果我使用spawn_link BIF 生成一个进程,当生成的进程崩溃时,我似乎会自动获得一个有用的错误报告,清楚地​​表明崩溃发生在哪一行代码。但是,如果我改为使用 proc_lib:start_link 生成进程,我不会得到有用的信息。

问题:无论进程是如何产生的,如何确保在崩溃时获得详细的错误报告,如下所示?

举例说明:

-module(crasher).
-export([start1/0, start2/0, init1/0, init2/0]).

start1() ->
        proc_lib:start_link(?MODULE, init1, []).

start2() ->
        spawn_link(?MODULE, init2, []).

init1() ->
        proc_lib:init_ack(ok),
        crash().

init2() ->
        crash().

crash() ->
        crash = here.

这会导致这种行为:

42> crasher:start1().
** exception exit: {badmatch,here}
43> 
43> 
43> 
43> crasher:start2().
** exception exit: {badmatch,here}
     in function  crasher:crash/0 (crasher.erl, line 18)
44> 
=ERROR REPORT==== 14-Mar-2016::11:51:57 ===
Error in process <0.244.0> with exit value:
{{badmatch,here},[{crasher,crash,0,[{file,"crasher.erl"},{line,18}]}]}

44> 

注意,当使用 proc_lib:start_link 时,我只得到一个 badmatch 原子,但是当使用 spawn_link 时,我得到一个整洁的原子错误报告准确说明崩溃发生在哪一行。

【问题讨论】:

    标签: logging error-handling erlang


    【解决方案1】:

    为确保您始终获得有用的错误报告并为自己节省大量调试时间,请运行SASL (System Application Support Libraries) application。随着sasl 运行,您会从crasher:start1/0 调用中获得完整的崩溃报告:

    1> application:start(sasl).
    
    =PROGRESS REPORT==== 14-Mar-2016::09:05:24 ===
              supervisor: {local,sasl_safe_sup}
                 started: [{pid,<0.59.0>},
    <...long output abbreviated...>
    ok
    2> crasher:start1().
    
    =CRASH REPORT==== 14-Mar-2016::09:05:31 ===
      crasher:
        initial call: crasher:init1/0
        pid: <0.64.0>
        registered_name: []
        exception error: no match of right hand side value here
          in function  crasher:crash/0 (/private/tmp/crasher.erl, line 18)
        ancestors: [<0.50.0>]
        messages: []
        links: [<0.50.0>]
        dictionary: []
        trap_exit: false
        status: running
        heap_size: 376
        stack_size: 27
        reductions: 91
      neighbours:
        neighbour: [{pid,<0.50.0>},
                      {registered_name,[]},
                      {initial_call,{erlang,apply,2}},
                      {current_function,{proc_lib,sync_wait,2}},
                      {ancestors,[]},
                      {messages,[{ack,<0.64.0>,ok}]},
                      {links,[<0.26.0>,<0.64.0>]},
                      {dictionary,[]},
                      {trap_exit,false},
                      {status,runnable},
                      {heap_size,2586},
                      {stack_size,27},
                      {reductions,4275}]
    ** exception exit: {badmatch,here}
    3> crasher:start2().
    
    =ERROR REPORT==== 14-Mar-2016::09:10:26 ===
    Error in process <0.67.0> with exit value:
    {{badmatch,here},
     [{crasher,crash,0,[{file,"/private/tmp/crasher.erl"},{line,18}]}]}
    ** exception exit: {badmatch,here}
         in function  crasher:crash/0 (/private/tmp/crasher.erl, line 18)
    

    如果您总是希望在运行 sasl 的情况下启动交互式 shell,请从命令行运行 erl -boot start_sasl

    【讨论】:

      最近更新 更多