Да, нет никакой потребности в усовершенствованной математике - если Вы программируете коммерческий - от программного обеспечения полки.
Однако при контакте с жестким материалом, таким как:
Некоторое усовершенствованное знание математики могло бы пригодиться. И это не похоже, они - "out-of-this мировые" проблемы.
я должен был создать программное обеспечение, чтобы попытаться "предсказать" необходимое количество бумаги для офиса (и это был ад только для обнаружения лучшего способа к приближенным значениям).
необходимо быть осторожными, тем не менее, потому что легко потеряться при использовании усовершенствованных вещей - существует мой друг, который обратился к использованию Turing для хранения состояния динамического меню только для отображения его правильно - humm..., возможно, он wnet слишком далеко в его воображении.
Если ваш процесс использует OTP , достаточно выполнить sys: get_status (Pid)
.
Упомянутое вами сообщение об ошибке отображается как SASL . SASL - это демон сообщения об ошибках в OTP .
Состояние, о котором вы говорите в своем примере кода, является просто аргументом хвостовой рекурсивной функции . Невозможно извлечь его с помощью чего-либо, кроме отслеживания BIF. Я предполагаю, что это было бы неправильным решением в производственном коде, поскольку трассировка предназначена для использования только в целях отладки .
Правильное и протестированное в отрасли решение будет широко использовать OTP в вашем проект. Затем вы можете в полной мере воспользоваться отчетами об ошибках SASL, модулем rb
для сбора этих отчетов,
Похоже, вы делаете проблему из ничего. 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>
Насколько я знаю, вы не можете получить аргументы, переданные в локально вызываемую функцию. Я хотел бы, чтобы кто-нибудь доказал, что я неправ.
-module(loop).
-export([start/0, loop/1]).
start() ->
spawn_link(fun () -> loop([]) end).
loop(State) ->
receive
Msg ->
loop([Msg|State])
end.
Если мы хотим отследить этот модуль, вы сделаете следующее в оболочке.
dbg:tracer().
dbg:p(new,[c]).
dbg:tpl(loop, []).
Используя эту настройку трассировки, вы увидите локальные вызовы ('l' в tpl означает, что Также будут отслеживаться локальные вызовы, а не только глобальные).
5> Pid = loop:start().
(<0.39.0>) call loop:'-start/0-fun-0-'/0
(<0.39.0>) call loop:loop/1
<0.39.0>
6> Pid ! foo.
(<0.39.0>) call loop:loop/1
foo
Как видите, учитываются только вызовы. Никаких аргументов не видно.
Я рекомендую основывать правильность отладки и тестирования на отправленных сообщениях, а не на состоянии, сохраняемом в процессах. Т.е. если вы отправляете процессу кучу сообщений, утверждайте, что он делает правильные вещи, а не что у него есть определенный набор значений.
Но, конечно, вы также можете добавить erlang: display (State)
временно вызывает ваш код. Отладка бедняги.