如何在elixir中找到进程的开始位置

时间:2016-02-17 11:50:39

标签: erlang elixir

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

snapshot of observer

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

建议将受到高度赞赏。感谢。

3 个答案:

答案 0 :(得分:1)

首先,您必须始终拥有流程的PID或其参考名称。

Process.info/2

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

process_info-2

还有arity 1变体:Process Docs

答案 1 :(得分:1)

[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()).

答案 2 :(得分:0)

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

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