Если я напишу какой-нибудь код на erlang для построения дерева наблюдения, а затем запущу приложение при загрузке с помощью следующей команды, может быть очень сложно понять, почему оно не работает:
erl -s myapp -pa ebin ... ...
(пример модуля myapp)
-module(myapp).
-export([start/0]).
start() -> application:start(myapp).
Допустим, мое приложение запускает супервизор myapp_sup. myapp_sup в свою очередь запускает несколько супервизоров (скажем, server_sup, database_sup, Another_sup).
Эти супервизоры запустят несколько gen_servers.
В какой-то момент, если в моем коде есть ошибка, я не могу ее найти!
Я написал вызов somemodule:functionthatdoesnexists() в обратном вызове инициализации некоторого gen_server.
Все, что vm говорит, это «завершение инициализации при загрузке», а затем отображение местоположения ошибки несоответствия, точного файла и строки моего верхнего модуля (myapp).
(Плохое соответствие, потому что ok = application:start(...) не будет соответствовать).
Я смотрю в файле erl_crash.dump, и там нет информации об этой неопределенной функции (но я нахожу ее в списке атомов).
Итак, я написал некоторый журнал, чтобы примерно увидеть, где ошибка, но затем мне придется запустить мои gen_servers вручную, чтобы получить правильную информацию об ошибке.
Что я упускаю, как я могу понять это быстрее?
Спасибо