pDI-Tools: Mecanismo de interposición dinámica de código | ||
---|---|---|
Anterior | Capítulo 6. Configuración de pDI-Tools | Siguiente |
Seguidamente mostramos dos ficheros de configuración, uno global para todo el sistema y uno de usuario y explicamos posteriormente como interaccionan entre ambos para dar la configuración final.
Ambos ficheros se llaman pdi.cfg, pero el de sistema (global) reside en el directorio /usr/local/pditools/etc (pDI-Tools se encuentra instalado en el directorio /usr/local/pditools) y el de usuario en el directorio actual.
El fichero de configuración global del sistema es el siguiente:
############################################################################### # FICHERO DE CONFIGURACIÓN GLOBAL DEL SISTEMA ############################################################################### ############################################################################### # SECCIÓN GLOBAL # # Esta sección no debería de usarse directamente, así que emitimos un warning # avisando de ello y cargamos la configuración por defecto. # [global] Warning Se está usando el fichero de configuración del sistema directamente. Include ":defaults" Include ":runtime" ############################################################################### # SECCIÓN DEFAULTS # # En esta sección se ponen los valores por defecto para todo el sistema. # [defaults] # Desactivamos el modo de depuración debug = off # No dejamos instrumentar los backends y a pDI-Tools donttouch_backends = on donttouch_pdi = on # Asumimos que una aplicación no tendrá nunca más de 50 objetos en memoria. max_objects = 50 # Suponemos que no habrán nunca más de 32 threads simultaneos y se inicializan # todos al iniciarse pDI-Tools. max_threads = 32 num_threads = 32 # Por si acaso instrumentamos un DSO con muchas funciones creamos una pool # grande de stubs para callback cb_max_stubs = 1000 # No suelen haber instrumentaciones reentrantes, asi que tomamos una pila para # los threads pequeña cb_stack_size = 512 # Ponemos las rutas de búsqueda de los backends y sus ficheros de comandos # NOTA: Se añaden a las rutas de búsqueda por defecto be_path = ~/lib/backends:~/backends:~/lib:./ becfg_path = ~/etc/:~/becfg:./ ############################################################################### # SECCIÓN RUNTIME # # Aquí incluimos el backend de runtime que gestionará algunas funciones # críticas. # [runtime] runtime = /usr/local/pditools/lib/runtime.so # FIN DEL FICHERO DE CONFIGURACIÓN GLOBAL DEL SISTEMA
Podemos observar que el fichero de configuración global se divide en tres secciones: la sección global, la sección defaults y la sección runtime.
La sección global se usa explicitamente y sólo contiene tres comandos. Lo primero que hace es advertir de que se está usando la sección global de este fichero y luego incluye el contenido de las otras dos secciones.
Se da esta advertencia ya que no recomendamos usar esta configuración directamente, sino a traves de otros ficheros de configuración. Se supone que no cargarán directamente la sección global para evitar la aparición de este "warning". Cuando pDI-Tools no encuentra ningún fichero de configuración usa el fichero de configuración del sistema y comienza a ejecutarlo, como cualquier otro fichero, por su sección global. Con esta advertencia avisa al usuario de que está usando la configuración por defecto ya que probablemente éste ha olvidado establecer su propia configuración.
Mientras que el fichero de configuración privado del usuario es el siguiente:
############################################################################### # CONFIGURACIÓN PRIVADA DEL USUARIO ############################################################################### # Configuración global de este fichero [global] verbose = 3 Log Vamos a procesar la configuración por defecto Include "/usr/local/pditools/etc/pdi.cfg:defaults" Include "/usr/local/pditools/etc/pdi.cfg:runtime" Log Vamos a procesar la configuración de plataforma Include ":%PLATFORM%" # Configuración específica para plataformas linux [linux-gnu] Log Estamos en un sistema Linux config = linux.cfg debug = off # Configuración específica para plataformas Solaris 8 [solaris2.8] Log Estamos en un sistema Solaris config = solaris.cfg debug = on # Configuración específica para Irix [irix6.5] Log Estamos en un sistema Irix config = irix.cfg debug = on # FIN DEL FICHERO DE CONFIGURACIÓN PRIVADA DEL USUARIO
Este fichero también está dividido en secciones, pero de una forma bastante diferente. Comienza al igual que el anterior con la sección global. Esta sección, sólo comenzar sube la verbosidad al máximo. De esta forma podremos ver los mensajes de "log" que imprimirán los ficheros de configuración. Seguidamente se encarga de traer la configuración contenida en las secciones defaults y runtime de la configuración global del sistema. Una vez procesadas esas secciones del fichero global, se procesa una de las secciones específicas para la plataforma de este fichero. Cada una de estas secciones usa un fichero de comandos de reenlace distinto según la plataforma en la que estamos, y si es Irix o Solaris se activa el sistema de depuración de pDI-Tools.
Suponiendo que usamos estos ficheros de configuración en un sistema GNU/Linux™ con un kernel 2.6.8 y GNU C Library 2.3.2, tendríamos una salida como la siguiente (mostramos tan sólo los mensajes generados por el sistema de configuración y no la salida completa de una instrumentación):
ger@pandero:~/test$ LD_PRELOAD=/usr/local/pditools/libpdi.so ./mytest pdiconfig.c:/home/ger/test/pdi.cfg:31:Vamos a procesar la configuración por def ecto. pdiconfig.c:/home/ger/test/pdi.cfg:33:Vamos a procesar la configuración de plat aforma. pdiconfig.c:/home/ger/test/pdi.cfg:40:Estamos en un sistema Linux. ---------------------------------------------------------------------- pDI-Tools version 0.1.0, Copyright (C) 2004, 2005 Gerardo García Peña pDI-Tools comes with ABSOLUTELY NO WARRANTY; for details read the `COPYING' file that comes with this library. This is free software, and you are welcome to redistribute it under certain conditions; read the `COPYING' file for details. ---------------------------------------------------------------------- init.c:initLiblink:Se ha cargado la configuración de pDI-Tools. ger@pandero:~/test$
La línea que ejecutamos contiene dos comandos en una: el primero
establece la variable de entorno LD_PRELOAD
que fuerza la carga de
pDI-Tools y el segundo ejecuta el programa.
Obsérvese que los mensajes de los ficheros de configuración aparecen antes de la nota de copyright de pDI-Tools. Esto es debido a que esta nota de copyright se escribe tambien con el mecanismo de "logs" estándar, y este a su vez no termina de estar completamente inicializado hasta que se termina de procesar los ficheros de configuración.
A partir de la nota de copyright pDI-Tools ya ha procesado toda la configuración, y de hecho informa de ello una vez que la ha impreso mediante un mensaje de "log". Llegados a este punto no se vuelven a consultar ni las variables de entorno ni los ficheros de configuración.