2010-11-23 6 views
11

¿Es posible obtener el estado actual de un proceso gen_server (presumiblemente al enviar algún mensaje del sistema)? Podría ser útil cuando se depura.Obtención del estado gen_server/gen_fsm para la depuración

Por supuesto, puedo añadir un mensaje que devuelve el estado actual de handle_call:

get_state(Server) -> gen_server:call(Server, '$get_state'). 

%% in every gen_server I want to debug 
... 
handle_call('$get_state', _From, State) -> 
    {reply, State, State}; 
... 

pero ¿hay algo incorporado (incluso si es un poco hacky)?

+0

¿Qué hay de malo en conectarse al proceso gen_server con el depurador incorporado y depurarlo realmente? –

+0

No GS en el sistema integrado, por lo que no hay depurador (¿o puede ejecutarse sin gráficos?). –

+0

Si se puede acceder al nodo desde el exterior, puede depurarlo desde una máquina remota con GS-IMHO, es uno de los puntos fuertes de Erlang. –

Respuesta

25

Use sys:get_status/1,2 function. definición, es de:

get_status(Name,Timeout) -> 
    {status, Pid, {module, Mod}, [PDict, SysState, Parent, Dbg, Misc]} 

SysState contendrá estado del proceso. Funciona para todos los procesos que utilizan comportamientos OTP y otros procesos que implementan los requisitos proc_lib y sys.

Cuestiones relacionadas