2012-08-03 16 views
6

¿Hay alguna manera de indicar a la máquina virtual de Erlang que aplique un conjunto de indicadores de proceso a cada nuevo proceso que se genera en el sistema?Indicadores de proceso predeterminados

Por ejemplo, en el entorno de prueba Me gustaría que cada proceso tenga save_calls flag set.

Respuesta

1

Una forma de hacerlo es combinar las funcionalidades de seguimiento de Erlang con un archivo .erlang.

En concreto, se puede utilizar el bajo nivel de las capacidades proporcionadas por erlang:trace/3 trazado o simplemente podría explotar la función dbg:tracer/2 para crear un nuevo proceso de depuración que ejecuta la función de controlador costumbre cada vez que se recibe un mensaje de rastreo.

Para automatizar un poco las cosas, puede crear un archivo Erlang Start Up en el directorio donde está ejecutando su código o en su directorio particular. El archivo de inicio de Erlang es un archivo especial, llamado .erlang, que se ejecuta cada vez que inicia el sistema de tiempo de ejecución.

algo como lo siguiente debe hacer el trabajo:

% -*- Erlang -*- 
erlang:display("This is automatically executed."). 
dbg:tracer(process, {fun ({trace, Pid, spawn, Pid2, {M, F, Args}}, Data) -> 
          process_flag(Pid2, save_calls, Data), 
          Data; 
         (_Trace, Data) -> 
          Data 
        end, 100}). 
dbg:p(new, [procs, sos]). 

Básicamente, estoy creando un nuevo proceso de rastreo, que se traza procesos (primer argumento). Estoy especificando una función de controlador para ejecutar y algunos datos iniciales. En la función del controlador, estoy configurando el indicador save_calls para los procesos recién generados, mientras ignoro todos los demás mensajes de seguimiento. Establecí la opción save_calls 'en 100, usando el parámetro Datos iniciales. En la última llamada, le digo a dbg que solo me interesan los procesos recién creados. También estoy configurando la opción sos (set_on_spawn) para garantizar la herencia de los indicadores de seguimiento.

Finalmente, observe cómo necesita usar una variante de la función process_flag, que toma un argumento adicional (el Pid del proceso para el que desea establecer el indicador).