【问题标题】:How to find where a process started in elixir如何在 elixir 中查找进程的开始位置
【发布时间】:2016-02-17 23:19:33
【问题描述】:

我在 elixir 中使用观察者,以下是应用程序的快照 [在应用程序选项卡下]:

一旦它们的工作完成,我需要退出这些进程。不知何故,我无法弄清楚某些过程的起源。有没有办法在 elixir/erlang 中找出创建特定进程的模块/函数?

我们将不胜感激。谢谢。

【问题讨论】:

    标签: erlang elixir


    【解决方案1】:

    首先,您必须始终拥有进程的 PID 或其引用名称。

    Process.info/2
    

    将为您提供有关该流程的信息。您可能会获得更多有关此函数在其调用的 Erlang 函数中如何工作的文档和信息:

    process_info-2

    还有 arity 1 变体:Process Docs

    【讨论】:

      【解决方案2】:
      [erlang:process_info(Pid, initial_call) || Pid <- erlang:processes()].
      

      但请注意gen_server等,都有相同的初始调用,所以你需要再深入一点。

      以下内容改编自https://gist.github.com/rlipscombe/a8e87583d47799170f8b

      lists:map(
          fun(Pid) ->
              InitialCall = case erlang:process_info(Pid, initial_call) of
                  {initial_call,{proc_lib,init_p,A}} ->
                      case erlang:process_info(Pid, dictionary) of
                          {dictionary, D} ->
                              proplists:get_value('$initial_call', D, undefined);    
                          _ ->
                              {proc_lib,init_p,A}
                      end;
                  {initial_call,{erlang,apply,A}} ->
                      case erlang:process_info(Pid, current_function) of
                          {current_function,MFA} -> MFA;
                          _ -> {erlang,apply,A}
                      end;
                  {initial_call,IC} ->
                      IC;
                  Other ->
                      Other
              end,
              {Pid, InitialCall}
          end, erlang:processes()).
      

      【讨论】:

        【解决方案3】:

        使用process_info/1,您可以获得进程信息列表,initial_callcurrent_function 可以帮助您分别找到生成进程的初始函数调用和进程的当前函数调用。

        process_info(Pid, initial_call)process_info(Pid, current_function) 函数也用作快捷方式。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-12
          • 2015-01-21
          • 2013-11-07
          • 2020-11-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多