简体   繁体   中英

Getting gen_server/gen_fsm state for debugging

Is it possible to obtain the current state of a gen_server process (presumably by sending some system message)? It could be useful when debugging.

Of course, I can add a message which returns the current state to 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};
...

but is there something built-in (even if it is a bit hacky)?

Use sys:get_status/1,2 function . It's definition is:

get_status(Name,Timeout) -> 
    {status, Pid, {module, Mod}, [PDict, SysState, Parent, Dbg, Misc]}

SysState will contain state of the process. It works for all processes using OTP behaviors and other processes implementing proc_lib and sys requirements.

There is actually a function that returns the state directly: sys:get_state/1,2 . It accepts pid or name of the process and can optionally be given a timeout.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM