12

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

但是有内置的东西(即使它有点hacky)?

4

2 回答 2

28

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

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

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

于 2010-11-23T09:42:50.157 回答
3

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

于 2020-08-10T08:59:09.383 回答