[erlang] Почему при краше процесса не видно стектрейс?
От: Васильич  
Дата: 09.09.09 19:30
Оценка:
Здравствуйте.

Вот столкнулся с новой проблемой. Итак, есть несколько процессов, при запуске которых используются функции из модулей 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().
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.