【问题标题】:Elixir/Erlang - Trace when a message arrives in the mailboxElixir/Erlang - 跟踪邮件何时到达邮箱
【发布时间】:2022-01-20 14:24:29
【问题描述】:

相当直接的问题,是否可以跟踪到达Process/GenServer(的邮箱)的邮件?请注意,这与邮件为received 时的跟踪不同(一旦邮件离开邮箱并被处理)。直到现在我还没有找到这样做的方法。

【问题讨论】:

    标签: erlang elixir actor gen-server


    【解决方案1】:

    在 erlang 中,dbg:p/2s 用于发送,r 用于接收:

    1> dbg:tracer().
    {ok,<0.82.0>}
    2> dbg:p(self(), r).
    (<0.80.0>) << {dbg,{ok,[{matched,nonode@nohost,1}]}}
    (<0.80.0>) << {io_reply,#Ref<0.2586582558.1779957764.183997>,319}
    {ok,[{matched,nonode@nohost,1}]}
    (<0.80.0>) << {io_reply,#Ref<0.2586582558.1779957764.184000>,
                            [{expand_fun,#Fun<group.0.82824323>},
                             {echo,true},
                             {binary,false},
                             {encoding,latin1}]}
    (<0.80.0>) << {io_reply,#Ref<0.2586582558.1779957764.184002>,ok}
    3> self() ! trace_me.
    (<0.80.0>) << {shell_cmd,<0.73.0>,
                             {eval,[{op,{1,8},
                                        '!',
                                        {call,{1,1},{atom,{1,1},self},[]},
                                        {atom,{1,10},trace_me}}]},
                             cmd}
    (<0.80.0>) << trace_me
    (<0.80.0>) << {io_reply,#Ref<0.2586582558.1779957764.184006>,319}
    trace_me
    (<0.80.0>) << {io_reply,#Ref<0.2586582558.1779957764.184008>,
                            [{expand_fun,#Fun<group.0.82824323>},
                             {echo,true},
                             {binary,false},
                             {encoding,latin1}]}
    (<0.80.0>) << {io_reply,#Ref<0.2586582558.1779957764.184011>,ok}
    

    【讨论】:

    • 这将追踪receive(一旦它离开邮箱并被处理),对吧?我想追踪到达,当它进入邮箱时。
    • @Astarno 我认为这个选项会在邮件进入邮箱时进行跟踪:请注意,在示例中,被跟踪的进程(self(),shell)不会执行receive。由于shell有点特殊,我也会用编译后的代码来验证它,但我认为不会有区别
    • 正如 José 所说,接收跟踪是针对将邮件放入邮箱的时间。无法跟踪邮件何时从邮箱中删除。
    • 是否有办法过滤掉某些消息(例如 io_reply)?
    • 我有一些类似dbg:tracer(process, {fun(Trace, Out) -&gt; dbg:dhandler(Trace, Out) end, standard_io}) 的东西可以在某些情况下自定义跟踪消息。您需要过滤掉您不想打印的 Trace 消息,Trace 消息如下所示:{trace,pid(),'receive',trace_me}
    猜你喜欢
    • 2016-03-21
    • 2012-11-17
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 2013-08-29
    相关资源
    最近更新 更多