Un patrón común en Erlang es el bucle recursivo que mantiene el estado:Consulta un proceso de Erlang para su estado?
loop(State) ->
receive
Msg ->
NewState = whatever(Msg),
loop(NewState)
end.
¿Hay alguna forma de consultar el estado de un proceso en ejecución con un bif o rastreo o algo? Dado que los mensajes de error dicen "... cuando el estado era ..." y muestran el estado del proceso estrellado, pensé que esto sería fácil, pero me decepcionó que no haya podido encontrar un bif para hacer esto.
Entonces, pensé que utilizar el rastreo del módulo dbg lo haría. Desafortunadamente, creo que debido a que estos bucles están optimizados para llamadas de cola, dbg solo capturará la primera llamada a la función.
¿Alguna solución?
La función es sys: get_status/1. – cthulahoops
+1: sys: get_status/1 es tu amigo. Uso esto todo el tiempo. –
Jaja, cosas increíbles! Usaré esto todo el tiempo, también. Dicho sea de paso, gleber, intento utilizarlo solo para la depuración, no para el registro a largo plazo en un sistema de producción. Y, por supuesto, sé cuál es el estado que menciono. No estoy seguro de por qué las personas en este hilo siguen queriendo aclarar esto. Estoy usando el estado exactamente de la misma manera que, por ejemplo, lo hace Joe Armstrong en su libro. No hay otra forma adecuada de mantener el estado temporal en Erlang que enrutarlo a través de bucles recursivos. De hecho, tengo entendido que eso es precisamente lo que está sucediendo detrás de escena en gen_server, también. – mwt