Запросить процесс Erlang для его состояния?

Да, нет никакой потребности в усовершенствованной математике - если Вы программируете коммерческий - от программного обеспечения полки.

Однако при контакте с жестким материалом, таким как:

  • Вычисление траекторий для управления роботом
  • Создающие подобные АЙ приложения для поддержки неуверенности и автоматического обоснования
  • Проигрывание с 3-D движением и графикой

Некоторое усовершенствованное знание математики могло бы пригодиться. И это не похоже, они - "out-of-this мировые" проблемы.

я должен был создать программное обеспечение, чтобы попытаться "предсказать" необходимое количество бумаги для офиса (и это был ад только для обнаружения лучшего способа к приближенным значениям).

необходимо быть осторожными, тем не менее, потому что легко потеряться при использовании усовершенствованных вещей - существует мой друг, который обратился к использованию Turing для хранения состояния динамического меню только для отображения его правильно - humm..., возможно, он wnet слишком далеко в его воображении.

15
задан Zed 10 October 2009 в 09:20
поделиться

3 ответа

Если ваш процесс использует OTP , достаточно выполнить sys: get_status (Pid) .

Упомянутое вами сообщение об ошибке отображается как SASL . SASL - это демон сообщения об ошибках в OTP .

Состояние, о котором вы говорите в своем примере кода, является просто аргументом хвостовой рекурсивной функции . Невозможно извлечь его с помощью чего-либо, кроме отслеживания BIF. Я предполагаю, что это было бы неправильным решением в производственном коде, поскольку трассировка предназначена для использования только в целях отладки .

Правильное и протестированное в отрасли решение будет широко использовать OTP в вашем проект. Затем вы можете в полной мере воспользоваться отчетами об ошибках SASL, модулем rb для сбора этих отчетов,

27
ответ дан 1 December 2019 в 00:50
поделиться

Похоже, вы делаете проблему из ничего. 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>                                                                                           
4
ответ дан 1 December 2019 в 00:50
поделиться

Насколько я знаю, вы не можете получить аргументы, переданные в локально вызываемую функцию. Я хотел бы, чтобы кто-нибудь доказал, что я неправ.

-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) временно вызывает ваш код. Отладка бедняги.

2
ответ дан 1 December 2019 в 00:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: