Здравствуйте.
Вот столкнулся с новой проблемой. Итак, есть несколько процессов, при запуске которых используются функции из модулей proc_lib и sys. Что-то вроде:
start_link(Args) ->
proc_lib:start_link(?MODULE, init,
[self(), Args]).
init(Parent, Args) ->
% Тут проводим инициализацию процесса
% ...
Debug = sys:debug_options([]),
State = #state{...},
proc_lib:init_ack(Parent, {ok, self()}),
loop(State, Parent, Debug).
loop(State, Parent, Debug) ->
receive
% Тут обрабатываем свои сообщения
% ...
{system, From, Request} ->
sys:handle_system_msg(
Request, From, Parent, ?MODULE, Debug, State)
end.
В общем, все как рекомендуется в доке. Теперь, как только в любом из этих процессов возникает рантаймовая ошибка, например function_clause, то процесс падает с причиной ошибки просто function_clause, без стектрейса:
=INFO REPORT==== 9-Sep-2009::23:20:16 ===
application: stp
exited: function_clause
type: temporary
=ERROR REPORT==== 9-Sep-2009::23:20:16 ===
** Generic server <0.53.0> terminating
** Last message in was {'DOWN',#Ref<0.0.0.58>,process,<0.48.0>,
function_clause}
** When Server state == {state,#Port<0.738>,undefined,<0.48.0>,undefined,on,
false,false,on,connected,undefined,0,
[#Port<0.736>,#Port<0.737>],
#Port<0.739>,#Port<0.740>}
** Reason for termination ==
** {stopped,{'EXIT',<0.48.0>,function_clause}}
При этом, процессы из этого же приложения, которые запускались через обычный spawn_link() или которые реализованы через стандартные бехавиоры — падают нормально, со стектрейсом:
** Generic server <0.53.0> terminating
** Last message in was {'DOWN',#Ref<0.0.0.58>,process,<0.48.0>,
{function_clause,
[{consumer,crash,[do_it]},
{consumer,handle_info,2},
{gen_server,handle_msg,5},
{proc_lib,init_p_do_apply,3}]}}
** When Server state == {state,#Port<0.738>,undefined,<0.48.0>,undefined,on,
false,false,on,connected,undefined,0,
[#Port<0.736>,#Port<0.737>],
#Port<0.739>,#Port<0.740>}
** Reason for termination ==
** {stopped,{'EXIT',<0.48.0>,
{function_clause,[{consumer,crash,[do_it]},
{consumer,handle_info,2},
{gen_server,handle_msg,5},
{proc_lib,init_p_do_apply,3}]}}}
Почему так, куда пропадает стек в первом случае? Я уже и гуглил, и изучал исходники proc_lib, gen_*, sys — ну нет там чего-то такого, что могло бы приводить к такому результату. А без стектрейсов отлаживать просто нереально. Сейчас приходится отказываться от proc_lib и даваемых ей преимуществ, запускать через spawn().