pDI-Tools: Mecanismo de interposición dinámica de código | ||
---|---|---|
Anterior | Capítulo 9. API de pDI-Tools | Siguiente |
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
; intn_be_path
; char **becfg_path
; intn_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
; intn_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
; intn_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.