Visualización y manipulación del archivo fuente con el programa de depuración dbx
Esta sección describe el proceso de visualizar y manipular el archivo fuente con el programa de depuración dbx.
Puede utilizar el programa de depuración dbx para buscar y visualizar partes de los archivos fuente de un programa.
No necesita un listado fuente actual para la búsqueda. El programa de depuración dbx realiza un seguimiento del archivo actual, el procedimiento actual y la línea actual. Si existe un archivo principal, la línea actual y el archivo actual se establecen inicialmente en la línea y el archivo que contienen la sentencia fuente donde ha finalizado el proceso. Esto sólo es cierto si el proceso se ha detenido en una ubicación compilada para la depuración.
Cambio de la vía de acceso del directorio de origen
De forma predeterminada, el programa de depuración dbx busca el archivo fuente del programa que se depura en los directorios siguientes:
- Directorio en el que se encontraba el archivo fuente cuando se compiló. Este directorio sólo se busca si el compilador ha colocado la vía de acceso de origen en el objeto.
- Directorio actual.
- Directorio donde se encuentra actualmente el programa.
Puede cambiar la lista de directorios en los que buscar utilizando la opción - en la línea de invocación dbx o emitiendo el submandato utilizar dentro del programa dbx . Por ejemplo, si ha movido el archivo de origen a una ubicación nueva desde el momento de la compilación, es posible que desee utilizar uno de estos mandatos para especificar la ubicación antigua, la ubicación nueva y alguna ubicación temporal.
Visualización del archivo actual
El submandato list le permite listar líneas de origen.
Los símbolos $ (signo de dólar) y @ (arroba) representan SourceLineExpression y son útiles con los subcomandos list, stop y trace. El símbolo $representa la siguiente línea que se va a ejecutar. El símbolo @ representa la siguiente línea que se listará.
El submandato move cambia el siguiente número de línea que se listará.
Cambio del archivo o procedimiento actual
Utilice los submandatos func y file para cambiar el archivo actual, el procedimiento actual, y la línea actual dentro del programa dbx sin tener que ejecutar ninguna parte del programa.
Busque en el archivo actual el texto que coincida con las expresiones regulares. Si se encuentra una coincidencia, la línea actual se establece en la línea que contiene el texto coincidente. La sintaxis del submandato de búsqueda es:
- / RegularExpression [/]
- Buscar hacia delante en el archivo de origen actual para la expresión dada.
- ? RegularExpression [?]
- Buscar hacia atrás en el archivo de origen actual para la expresión dada.
Si repite la búsqueda sin argumentos, el mandato dbx vuelve a buscar la expresión regular anterior. La búsqueda se ajusta al final o al principio del archivo.
También puede invocar un editor de texto externo para el archivo de origen utilizando el submandato edit . Puede alterar temporalmente el editor predeterminado (vi) estableciendo la variable de entorno EDITOR en el editor que desee antes de iniciar el programa dbx .
El programa dbx reanuda el control del proceso cuando se completa la sesión de edición.
Depuración de programas que implican varias hebras
Los programas que implican varias hebras de usuario llaman a la subrutina pthread_create. Cuando un proceso llama a esta subrutina, el sistema operativo crea una nueva hebra de ejecución dentro del proceso. Al depurar un programa multihebra, es necesario trabajar con hebras individuales en lugar de con procesos. El programa dbx solo funciona con hebras de usuario: en la documentación de dbx , la palabra thread normalmente se utiliza sola para indicar hebra de usuario. El programa dbx asigna un número de hebra exclusivo a cada hebra del proceso que se está depurando, y también soporta el concepto de una hebra en ejecución y actual:
- Ejecución de hebras
- Hebra de usuario responsable de detener el programa pulsando un punto de interrupción. Submandatos que en un solo paso el programa trabaja con la hebra en ejecución.
- Hebra actual
- La hebra de usuario que está examinando. Los submandatos que muestran información funcionan en el contexto de la hebra actual.
De forma predeterminada, la hebra en ejecución y la hebra actual son las mismas. Puede seleccionar una hebra actual diferente utilizando el submandato thread . Cuando el submandato thread muestra hebras, la línea de hebras actual va precedida de un >. Si la hebra en ejecución no es la misma que la hebra actual, su línea irá precedida de un *.
Depuración de programas que implican varios procesos
Los programas que implican varios procesos llaman a las subrutinas fork y exec . Cuando un programa se bifurca, el sistema operativo crea otro proceso que tiene la misma imagen que el original. El proceso original se denomina proceso padre, el proceso creado se denomina proceso hijo.
Cuando un proceso realiza una subrutina exec , un nuevo programa toma el control del proceso original. En circunstancias normales, el programa de depuración sólo depura el proceso padre. Sin embargo, el programa dbx puede seguir la ejecución y depurar los nuevos procesos cuando se emite el submandato multproc . El submandato multproc habilita la depuración multiproceso.
Cuando la depuración de multiproceso está habilitada y se produce una bifurcación, los procesos padre e hijo se detienen. Se abre una Xwindow de terminal virtual independiente para una nueva versión del programa dbx para controlar la ejecución del proceso hijo:
(dbx) multproc on
(dbx) multproc
multi-process debugging is enabled
(dbx) runCuando se produce la bifurcación, la ejecución se detiene en el padre y el programa dbx muestra el estado del programa:
application forked, child pid = 422, process stopped, awaiting input
stopped due to fork with multiprocessing enabled in fork at 0x1000025a (fork+0xe)
(dbx)A continuación, se abre otra Xwindow de terminal virtual para depurar el proceso hijo:
debugging child, pid=422, process stopped, awaiting input
stopped due to fork with multiprocessing enabled in fork at 0x10000250
10000250 (fork+0x4) )80010010 1 r0,0x10(r1)
(dbx)En este punto, se están ejecutando dos sesiones de depuración distintas. La sesión de depuración para el proceso hijo retiene todos los puntos de interrupción del proceso padre, pero sólo se puede volver a ejecutar el proceso padre.
Cuando un programa realiza una subrutina exec en modalidad de depuración multiproceso, el programa se sobrescribe y la información de símbolo original queda obsoleta. Todos los puntos de interrupción se suprimen cuando se ejecuta la subrutina exec ; el nuevo programa se detiene e identifica para que la depuración sea significativa. El programa dbx se conecta a la nueva imagen de programa, realiza una subrutina para determinar el nombre del nuevo programa, notifica el nombre y, a continuación, solicita la entrada. La solicitud es similar a la siguiente:
(dbx) multproc
Multi-process debugging is enabled
(dbx) run
Attaching to program from exec . . .
Determining program name . . .
Successfully attached to /home/user/execprog . . .
Reading symbolic information . . .
(dbx)Si un programa multihebra se bifurca, el nuevo proceso hijo sólo tendrá una hebra. El proceso debe llamar a la subrutina exec . De lo contrario, la información de símbolo original se conserva y los submandatos relacionados con hebras (como thread) muestran los objetos del proceso padre, que están obsoletos. Si se llama a una subrutina exec , la información de símbolo original se reinicializa y los submandatos relacionados con la hebra muestran los objetos en el nuevo proceso hijo.
Es posible seguir el proceso hijo de una bifurcación sin que se abra una nueva Xwindow utilizando el distintivo child del submandato multproc . Cuando se crea un proceso bifurcado, dbx sigue el proceso hijo. El distintivo parent del submandato multproc hace que dbx se detenga cuando se bifurca un programa, pero luego sigue al padre. Los distintivos hijo y padre siguen un proceso ejecutado. Estas banderas son muy útiles para depurar programas cuando Xwindows no está en ejecución.