它看起來像你是無中生有的問題。 erlang:process_info/1爲調試目的提供了足夠的信息。如果您真的需要循環函數參數,爲什麼您不回覆給調用者以響應您自己定義的特殊消息之一?
更新: 只是爲了澄清術語。在語言層面最接近'流程狀態'的是流程字典,其用法非常令人沮喪。它可以通過erlang查詢:process_info/1或erlang:process/2。 你真正需要的是跟蹤過程中的局部功能,其參數調用一起:
-module(ping).
-export([start/0, send/1, loop/1]).
start() ->
spawn(?MODULE, loop, [0]).
send(Pid) ->
Pid ! {self(), ping},
receive
pong ->
pong
end.
loop(S) ->
receive
{Pid, ping} ->
Pid ! pong,
loop(S + 1)
end.
控制檯:
Erlang (BEAM) emulator version 5.6.5 [source] [smp:2] [async-threads:0] [kernel-poll:false]
Eshell V5.6.5 (abort with ^G)
1> l(ping).
{module,ping}
2> erlang:trace(all, true, [call]).
23
3> erlang:trace_pattern({ping, '_', '_'}, true, [local]).
5
4> Pid = ping:start().
<0.36.0>
5> ping:send(Pid).
pong
6> flush().
Shell got {trace,<0.36.0>,call,{ping,loop,[0]}}
Shell got {trace,<0.36.0>,call,{ping,loop,[1]}}
ok
7>
函數是sys:get_status/1。 – cthulahoops 2009-08-14 10:37:25
+1:sys:get_status/1是你的朋友。我經常用這個。 – 2009-08-14 13:31:13
哈哈,真棒!我也會一直使用這個。 順便提一句,我確實打算只用它進行調試,而不是用於生產系統的長期記錄。 而且,當然,我知道我說的是什麼狀態。我不確定爲什麼在這個線程中的人不斷澄清這一點。我使用的狀態與喬阿姆斯特朗在他的書中所做的完全相同。在Erlang中,除了通過遞歸循環對其進行線程化之外,沒有其他合適的方法來維護臨時狀態。事實上,我的理解是,gen_server背後的情況正是如此。 – mwt 2009-08-14 16:24:10