【问题标题】:Getting gen_server/gen_fsm state for debugging获取 gen_server/gen_fsm 状态以进行调试
【发布时间】:2011-05-14 08:02:45
【问题描述】:

是否可以获得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)?

【问题讨论】:

  • 用内置调试器连接gen_server进程并实际调试有什么问题?
  • 嵌入式系统中没有GS,所以没有调试器(或者它可以在没有图形的情况下运行?)。
  • 如果节点可以从外部访问,您可以使用 GS 从远程机器调试它 - 恕我直言,这是 Erlang 的强项之一。
  • 如果调试器不起作用,您可以随时使用 dbg 设置跟踪模式,但是这两种方法都需要您通过发送命令来查看状态。如果你不想要这个,你可以使用 sys:get_status,如下 gleber 所述。
  • 另见this question

标签: erlang gen-server


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-07-22
      • 2019-07-10
      • 2011-08-31
      • 2015-01-21
      • 2017-05-31
      • 1970-01-01
      • 2011-04-27
      • 2011-07-04
      • 2017-04-11
      相关资源
      最近更新 更多