获取gen_server / gen_fsm状态以进行调试

时间:2010-11-23 08:31:38

标签: erlang gen-server

是否有可能获得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};
...

但是内置了什么(即使它有点黑客)?

2 个答案:

答案 0 :(得分:27)

使用sys:get_status/1,2 function。它的定义是:

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

SysState将包含进程的状态。它适用于使用OTP行为的所有进程以及实现proc_libsys要求的其他进程。

答案 1 :(得分:2)

实际上有一个直接返回状态的函数:sys:get_state/1,2。它接受进程的pid或名称,也可以选择指定超时。