Utilización del programa de depuración dbx
Esta sección contiene información sobre cómo utilizar el programa de depuración dbx .
Inicio del programa de depuración dbx
El programa dbx se puede iniciar con una variedad de distintivos. Las tres formas más comunes de iniciar una sesión de depuración con el programa dbx son:
- Ejecución del mandato dbx en un archivo de objeto especificado
- Utilización del distintivo -r para ejecutar el mandato dbx en un programa que finaliza de forma anómala
- Utilización del distintivo -a para ejecutar el mandato dbx en un proceso que ya está en curso
Cuando se inicia el mandato dbx , comprueba si hay un archivo .dbxinit en el directorio actual del usuario y en el directorio $HOME del usuario. Si existe un archivo .dbxinit , sus submandatos se ejecutan al principio de la sesión de depuración. Si existe un archivo .dbxinit en los directorios inicial y actual, ambos se leen en ese orden. Puesto que el archivo .dbxinit del directorio actual se lee en último lugar, sus submandatos pueden reemplazar a los del directorio de inicio.
Si no se especifica ningún archivo de objeto, el programa dbx solicita el nombre del archivo de objeto que se va a examinar. El valor predeterminado es a.out. Si el archivo core existe en el directorio actual o se especifica un parámetro CoreFile , el programa dbx informa de la ubicación donde ha fallado el programa. Las variables, registros y memoria que se mantienen en la imagen de nucleo pueden ser examinados hasta que comience la ejecucion del archivo de objeto. En ese momento, el programa de depuración dbx solicita mandatos.
Depuración de una imagen principal con módulos dependientes que faltan
A partir de AIX® 5.3, el programa ' dbx ' tiene la capacidad de examinar una imagen del núcleo incluso si uno o más módulos dependientes son inaccesibles. Durante la inicialización, se visualizan mensajes de notificación para cada módulo dependiente que falta.
- Todos los intentos del usuario de leer el contenido de la memoria que reside en las secciones de texto de los módulos dependientes que faltan dan como resultado un mensaje de error. El mensaje de error es como el error que se produce cuando no se puede acceder a los datos porque no residen en el archivo principal.
- El usuario no puede obtener información relativa a los símbolos que se habrían leído de las tablas de símbolos de los módulos dependientes que faltan. El comportamiento del programa dbx es similar al caso en el que se ha quitado la tabla de símbolos de un módulo dependiente.
- Los marcos de pila correspondientes a las rutinas dentro de los módulos dependientes que faltan se muestran simplemente como:
Además, se visualiza la dirección de instrucción dentro de la rutina desconocida y el nombre del módulo dependiente que falta correspondiente..()
El usuario siempre tiene la opción de dirigir el programa dbx a módulos dependientes accesibles utilizando el distintivo -p .
Depuración de una imagen de núcleo con módulos dependientes no coincidentes
A partir de AIX 5.3, el programa dbx detecta si los módulos dependientes a los que se hace referencia en el archivo principal son distintos de los que se crean en el archivo principal. Durante la inicialización, se visualizan mensajes de notificación para cada módulo dependiente no coincidente.
El usuario debe tener en cuenta que cualquier información visualizada por el programa dbx que se base en el contenido de un módulo dependiente no coincidente puede no ser fiable. En un esfuerzo por alertar al usuario sobre información que no debe ser de confianza, el programa dbx envía mensajes de notificación siempre que se visualiza información cuestionable.
Para inhabilitar esta función y forzar al programa dbx a tratar los módulos dependientes no coincidentes como módulos dependientes que faltan, el usuario puede exportar la variable de entorno DBX_MISMATCH_MODULE con un valor de DISCARD. Con esta variable exportada, el programa dbx sigue notificando al usuario la discrepancia, pero continúa como si los módulos dependientes no coincidentes fueran inaccesibles.
El usuario siempre tiene la opción de dirigir el programa dbx a módulos dependientes coincidentes utilizando el distintivo -p .
Ejecución de mandatos de shell desde dbx
Puede ejecutar mandatos de shell sin salir del programa de depuración utilizando el submandato sh .
Si se especifica sh sin ningún mandato especificado, el shell se especifica para su uso hasta que se sale, momento en el que el control vuelve al programa dbx .
Edición de línea de mandatos en dbx
El mandato dbx proporciona características de edición de línea de mandatos similares a las proporcionadas por el shell Korn. La modalidad vi proporciona características de edición similares a las de vi, mientras que la modalidad emacs le proporciona controles similares a emacs.
Puede activar estas funciones utilizando el subcomando set -o o set edit de dbx. Por lo tanto, para activar la edición de línea de mandatos de estilo vi, debe escribir el submandatoset edit vioset -o vi.
También puede utilizar la variable de entorno EDITOR para establecer la modalidad de edición.
El mandato dbx guarda los mandatos especificados en el archivo histórico .dbxhistory. Si la variable de entorno DBXHISTFILE no está establecida, el archivo histórico utilizado es $HOME/.dbxhistory.
De forma predeterminada, el mandato dbx guarda el texto de los últimos 128 mandatos especificados. La variable de entorno DBXHISTSIZE se puede utilizar para aumentar este límite.
Utilización del control de programa
El programa de depuración dbx le permite establecer puntos de interrupción (lugares de detención) en el programa. Después de especificar el programa dbx , puede especificar qué líneas o direcciones deben ser puntos de interrupción y, a continuación, ejecutar el programa que desea depurar con el programa dbx . El programa se detiene e informa cuando alcanza un punto de interrupción. A continuación, puede utilizar los mandatos dbx para examinar el estado del programa.
Una alternativa a establecer puntos de interrupción es ejecutar el programa una línea o instrucción a la vez, un procedimiento conocido como paso único.
Establecer y suprimir puntos de interrupción
Utilice el submandato stop para establecer puntos de interrupción en el programa dbx . El submandato stop detiene el programa de aplicación cuando se cumplen determinadas condiciones:
- La Variable se cambia cuando se especifica el parámetro Variable .
- La Condición es verdadera cuando se utiliza el distintivo if Condición .
- Se llama al Procedimiento cuando se utiliza el distintivo en Procedimiento .
- Se alcanza el número de línea SourceLine cuando se utiliza el distintivo en SourceLine .
Nota: La variable SourceLine se puede especificar como un entero o como una cadena de nombre de archivo seguida de un: (dos puntos) y un entero.
Después de cualquiera de estos mandatos, el programa dbx responde con un mensaje que informa del ID de suceso asociado con el punto de interrupción junto con una interpretación del mandato. Puede asociar submandatos dbx al ID de suceso especificado utilizando el submandato addcmd . Estos submandatos dbx asociados se emiten cuando se alcanza el punto de interrupción, el punto de rastreo o el punto de observación correspondiente a este evento. Utilice el submandato delcmd para suprimir los submandatos dbx asociados del ID de suceso especificado.
Running a Program
El submandato run inicia el programa. Indica al programa dbx que empiece a ejecutar el archivo de objeto, leyendo los argumentos como si se hubieran escrito en la línea de mandatos del shell. El submandato rerun tiene el mismo formato que run; la diferencia es que si no se pasan argumentos, se utiliza la lista de argumentos de la ejecución anterior. Una vez que el programa comienza, continúa hasta que se produce uno de los sucesos siguientes:
- El programa alcanza un punto de interrupción.
- Se produce una señal que no se ignora, como por ejemplo INTERRUPT o QUIT.
- Se produce un suceso de multiproceso mientras está habilitada la depuración de multiproceso.
- El programa realiza una carga, descarga, o la subrutina loadbind .
Nota: El programa dbx ignora esta condición si se establece la variable de depuración $ignoreload . Este es el valor por omisión. Para obtener más información, consulte el submandato set .
- El programa finaliza.
En cada caso, el programa de depuración dbx recibe el control y muestra un mensaje que explica por qué se ha detenido el programa.
Hay varias maneras de continuar el programa una vez que se detiene:
Mandato | Descripción |
---|---|
cont | Continúa el programa desde donde se detuvo. |
desconectar | Continúa el programa desde donde se detuvo, saliendo del programa de depuración. Esto es útil después de haber parcheado el programa y de querer continuar sin el programa de depuración. |
devolver | Continúa la ejecución hasta que se encuentra un retorno a Procedimiento o hasta que se devuelve el procedimiento actual si no se especifica Procedimiento . |
omitir | Continúa la ejecución hasta el final del programa o hasta que se ejecuten los puntos de interrupción Número + 1. |
paso | Ejecuta uno o un Número especificado de líneas de origen. |
siguiente | Se ejecuta hasta la siguiente línea de origen, o ejecuta un Número especificado de líneas de origen. |
Un método común de depuración es recorrer el programa una línea a la vez. Los submandatos step y next sirven a esta finalidad. La distinción entre estos dos mandatos es aparente sólo cuando la siguiente línea fuente que se va a ejecutar implica una llamada a un subprograma. En este caso, el submandato step se detiene en el subprograma; el submandato next se ejecuta hasta que el subprograma ha finalizado y, a continuación, se detiene en la siguiente instrucción después de la llamada.
La variable de depuración $stepignore se puede utilizar para modificar el comportamiento del submandato step .
No hay ningún número de suceso asociado a estas paradas porque no hay ningún suceso permanente asociado a la detención de un programa.
Si el programa tiene varias hebras, todas se ejecutan normalmente durante los submandatos cont, next, nextiy step . Estos mandatos actúan en la hebra en ejecución (la hebra que ha detenido la ejecución al alcanzar un punto de interrupción), por lo que incluso si otra hebra ejecuta el código que se está escalando, el cont, next, nexti, o la operación step continúa hasta que la hebra en ejecución también ha ejecutado ese código.
Si desea que estos submandatos ejecuten sólo la hebra en ejecución, puede establecer la variable de programa de depuración dbx $hold_next; esto hace que el programa de depuración dbx contenga todas las demás hebras de usuario durante cont, siguiente, nextiy submandatos step .
Nota: Si utiliza esta característica, recuerde que una hebra retenida no podrá liberar ningún bloqueo que haya adquirido; otra hebra que requiera uno de estos bloqueos podría bloquear el programa.
Separación de la salida dbx de la salida del programa
Utilice el submandato screen para depurar programas orientados a pantalla, como por ejemplo editores de texto o programas gráficos. Este submandato abre una Xwindow para la interacción de mandatos dbx . El programa sigue funcionando en la ventana en la que se originó. Si no se utiliza pantalla , la salida del programa dbx se mezcla con la salida del programa orientado a pantalla.
Rastreo de la ejecución
El submandato trace indica al programa dbx que imprima información sobre el estado del programa que se está depurando mientras se ejecuta dicho programa. El submandato trace puede ralentizar un programa considerablemente, en función del trabajo que tenga que realizar el programa dbx . Existen cinco formas de rastreo de programas:
- Puede realizar un solo paso del programa, imprimiendo cada línea fuente que se ejecuta. La variable de depuración $stepignore se puede utilizar para modificar el comportamiento del submandato trace . Consulte el submandato set para obtener más información.
- Puede restringir la impresión de líneas fuente cuando el procedimiento especificado está activo. También puede especificar una condición opcional para controlar cuándo se genera la información de rastreo.
- Puede visualizar un mensaje cada vez que se llame o se devuelva un procedimiento.
- Puede imprimir la línea fuente especificada cuando el programa alcance esa línea.
- Puede imprimir el valor de una expresión cuando el programa alcance la línea fuente especificada.
La supresión de sucesos de rastreo es lo mismo que la supresión de sucesos de detención. Cuando se ejecuta el submandato trace , el ID de suceso asociado se visualiza junto con la representación interna del suceso.