9.4. pdiconfig.h - Gestión de la configuración

Este fichero de cabecera exporta una estructura de tipo PDI_CONFIG con todos los parámetros de configuración de pDI-Tools. Esta estructura recibe el nombre PDICFG y seguidamente describimos cada uno de sus campos:

int allow_lib_as_be;

En principio está prohibido redirigir una llamada desde un DSO a otro DSO que no sea un "backend". No obstante es posible que en algún caso pueda ser interesante relajar esta restricción y esto es para lo que sirve este parámetro si se activa. Por defecto esta opción suele estar desactivado.


char **be_path;
int n_be_path;
char **becfg_path;
int n_becfg_path;

Estos campos indican las rutas de búsqueda a los "backend", en el caso de be_path, y a los ficheros de comandos en el caso de becfg_path. Estos campos son dos tablas de punteros, donde cada entrada es un puntero a una cadena con la ruta de búsqueda. Cada una de estas tablas tiene n_be_path y n_becfg_path elementos, respectivamente.


char **beconfig_files;
int n_beconfig_files;

Es la lista de ficheros de comandos que se han configurado para usar en pDI-Tools. El primero suele ser el runtime, y el resto ficheros de comandos estándar. Se organiza como una tabla de punteros a cadenas, donde cada entrada es la ruta a un fichero de configuración. Esta tabla contiene n_beconfig_files entradas.

int cb_allow_handler;

Parámetro booleano. Si está activado se permite usar un "callback handler" propio. Si está desactivado, pDI-Tools obliga a tener vacío o poner a NULL el cuarto parámetro de las reglas "callback".

Por defecto esta opción está desactivada.

int cb_max_stubs;

Indica cuantos "stubs" como máximo habrá en memoria. Es importante considerar que si vamos a poner un "callback" sobre un objeto que llama a X funciones diferentes, es conveniente que este parámetro tome un valor mayor que X o si no será imposible instalar el "callback".

El valor por defecto varía según la plataforma ya que se calcula con la función _pdi_arch_defaultMaxStubs(). Esta función devuelve, generalmente, el tamaño de página de la arquitectura dividida por el tamaño de un "stub". Por ejemplo, en INTEL® 386 esta función asigna 204 como valor por defecto a cb_max_stubs (4096 bytes por página y 20 bytes por "stub").

int cb_stack_size;

Al monitorizar los "threads" necesitamos una zona de memoria donde guardar información sobre que se está monitorizando en un determinado momento. Evidentemente, cada "thread" ha de tener su espacio separado. Esto se realiza mediante una pila cuyo tamaño viene definido por esta variable. Si durante una monitorización hay problemas ("Segmentation Fault"), pruebe a incrementar esta variable. Si con valores grandes sigue teniendo problemas quizás debería empezar a sospechar que hay una monitorización recursiva.

Por defecto vale 1024.

int debug;

Si está activo se realiza un montón de trabajo extra para verificar que las estructuras de datos, tanto de ELF como de pDI-Tools, son coherentes.

int donttouch_backends;

Si esta opción está activada, no se podrán realizar interposiciones sobre un "backend". Es aconsejable, por seguridad, tener activada esta opción.

Cuando está activada esta opción, los comodines no engloban a los "backend", sino sólo a los objetos regulares (y a libpdi.so si la opción donttouch_pdi está desactivada).

int donttouch_pdi;

Si esta opción está desactivada se podrá trabajar sobre libpdi.so. Evidentemente autoinstrumentar pDI-Tools es algo muy arriesgado y complejo, por lo tanto se desaconseja desactivar esta opción.


char **lib_path;
int n_lib_path;

Este campo indica las rutas de búsqueda de las librerías. Este campo, por defecto, es una copia de la variable de entorno LD_LIBRARY_PATH. Al igual que antes, lib_path es una tabla de punteros donde cada entrada es un puntero a una cadena con la ruta de búsqueda. Esta tabla contendrá n_lib_path entradas.


char *log_filename;
FILE *logfile;

Ruta al fichero y descriptor del fichero donde se imprimirán los mensajes de "log".

int max_objects;

Número máximo de objetos que puede haber en memoria (entre el binario, librerías y los "backends"). Es conveniente que sea un número algo alto, pero tampoco demasiado grande ya que si no consumimos mucha memoria.

Por defecto es 40.

int max_threads;

Este parámetro fija la máxima cantidad de "threads" que se pueden monitorizar. Es conveniente que el número no sea demasiado bajo, ya que si se superase el número de "threads" abortaría la ejecución del programa.

int num_threads;

No puede tener un valor mayor que max_threads. Indica el número de "threads" que se espera usar. De esta forma la inicialización y reserva de memoria se hace al inicio del programa y no durante la ejecución, evitando que la instrumentación tenga mucho impacto en la ejecución del programa.

Se pueden introducir los siguientes valores:

  • -1 - Inicializa todos los "threads" a la vez (en total max_threads) de golpe durante la inicialización. Esto implica el peor caso en consumo de memoria.

  • 0 - No inicializamos ningún "thread". Se irán inicializando según se necesiten.

  • +x - Inicializa x "threads". Si se supera el número el resto se van inicializando durante la ejecución del programa hasta un máximo de max_threads.

Por defecto vale 0.

int verbose;

Establece el nivel de verbosidad de los mensajes de "log": 0, silencio total (excepto errores); 1, solo advertencias y errores (valor por defecto); 2, imprime también mensajes normales y 3, que imprime también los mensajes de depuración.