Получение состояния gen_server/gen_fsm для отладки
Можно ли получить текущее состояние gen_server
процесс (предположительно путем отправки какого-либо системного сообщения)? Это может быть полезно при отладке.
Конечно, я могу добавить сообщение, которое возвращает текущее состояние handle_call
:
get_state(Server) -> gen_server:call(Server, '$get_state').
%% in every gen_server I want to debug
...
handle_call('$get_state', _From, State) ->
{reply, State, State};
...
но есть ли что-то встроенное (даже если оно немного хакерское)?
1 ответ
Решение
Использование sys:get_status/1,2
функция Это определение:
get_status(Name,Timeout) ->
{status, Pid, {module, Mod}, [PDict, SysState, Parent, Dbg, Misc]}
SysState
будет содержать состояние процесса. Он работает для всех процессов, использующих поведение OTP, и других процессов, реализующих proc_lib
а также sys
требования.
На самом деле есть функция, которая напрямую возвращает состояние: sys:get_state/1,2
. Он принимает pid или имя процесса и может иметь время ожидания.