Возвращаемое значение: {stop, Reason, StateData}, а не {stop, StateName, StateData}.
Отчет об ошибке генерируется, если причиной является что-то отличное от нормального или выключение. Для нормального выхода из вашего сервера используйте обычное, завершение работы используется, когда сервер запрашивает выход своего супервизора.
(Изменить сейчас, когда были добавлены подробности ошибки.)
gen_fsm
звонит client_fsm:terminate(normal, loggedin, {state,#Port<0.144>,12345,"Bob"})
, что приводит к исключению function_clause (функция существует, но никакие предложения не могут быть сопоставлены с этими аргументами). Если вы измените client_fsm:terminate/3
, чтобы этот вызов был успешным, ошибка должна исчезнуть.