Re[2]: [erlang] Почему при краше процесса не видно стектрейс
От: Васильич  
Дата: 10.09.09 06:40
Оценка:
Здравствуйте, DmitryMe, Вы писали:

DM>Наверно потому что


DM>

DM>The module sys contains some functions for simple debugging of processes implemented using behaviours


DM>Процесс должен реализовывать один из gen_* шаблонов.


Я тоже так сначала думал. Но ведь исходники gen_* шаблонов доступны, они сами построены на proc_lib и sys. И они не делают чего-то этакого, все стандартно, что сделано и у меня. Более того, вчера я наткнулся на еще кое-что.

Допустим есть процесс, который использует для запуска proc_lib (первый процесс из моего первого поста). Когда возникает рантайм-еррор — он падает без стектрейса. Но! Если поймать этот эксепшен вручную и потом сразу его бросить с помощью exit() — то все работает нормально! Я даже сделал специальную функцию:

runtime_error_workaround(R) ->
    case R of
        {'EXIT', Reason} -> exit(Reason);
        _ -> R
    end.


и использую ее вот так:

message_loop(Parent, Debug, State) ->
    receive
        {announce, Announce} ->
            NewState = runtime_error_workaround(catch handle_announce(State, Announce)),
            message_loop(Parent, Debug, NewState);
        {system, From, Request} ->
            sys:handle_system_msg(Request, From, Parent, ?MODULE, Debug, State);
        stop ->
            terminate(normal, State)
    end.


То есть, в изначальном эксепшене, который генерируется интерпретатором, присутствует вся необходимая инфа, в том числе и стектрейс (это я проверил). Если повторно бросить этот эксепшен через exit() — то вся информация из него показывается в error-репорте. Если же этот эксепшен перехватывается самой proc_lib — то стектрейс отсутствует. Такое ощущение, что она его обрезает, хотя судя по ее исходникам такого происходить не должно. Мистика? Или я что-то упускаю?

И у меня еще один вопрос в связи с этим: как можно в отладчике отлаживать системные библиотеки (ту же proc_lib)? Я запускаю отладчик через im(), он позволяет проинтерпретировать мои собственные модули, но не системные. Я хочу установить точку останова на момент, когда proc_lib перехватывает возникающие в процессе исключения, и посмотреть что с ними происходит.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.