【发布时间】: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