Здравствуйте, 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 перехватывает возникающие в процессе исключения, и посмотреть что с ними происходит.