Las restricciones de las llamadas de función y show_self son
las siguientes:
- No pueden llamar a exec().
- No pueden terminar la hebra ni el proceso.
- No pueden lanzar una señal.
- No pueden llamar a longjmp() a menos que el destino de
longjmp() esté dentro de la función.
- No pueden lanzar una excepción C++ a menos que la excepción se maneje dentro de la
función.
- Deben terminar dentro de un período de tiempo razonable. Esto puede controlarse con
la variable de entorno DER_DBG_SHOWSELF_TIMEOUT. El valor predeterminado
es de 10 segundos.
- En una aplicación multihebra, la función no puede hacer suposiciones acerca de en qué
hebra se está ejecutando, y debe presuponer que todas las demás hebras del proceso han
quedado suspendidas. En particular:
- No puede depender de otras hebras, y debe presuponer que las otras hebras pueden
estar reteniendo recursos necesarios. Específicamente, la llamada a
pthread_mutex_lock() puede provocar que la función se cuelgue.
- No todas las funciones de biblioteca C/C++ son reentrantes. Muchas funciones seguras
en ejecución multihebra de libc.a, incluida la asignación de memoria y
las funciones de entrada/salida, no son reentrantes. Son reutilizables en modalidad serie. Estas
funciones utilizan pthread_mutex_lock() para implementar la
capacidad de reutilización en serie, por lo que el hecho de llamarlas tiene una baja probabilidad
de colgar la sesión de depuración.
- Todos los cambios que la función realiza en el estado global del proceso que se
depura continuará después de que la función efectúe el retorno.
- El efecto de llamar a pthread_create() es indefinido.
- La función show_self incluye llamadas que dirigen la salida a
la consola. Estas llamadas son printf(),
fprintf() y la clase cout. El depurador ejecuta la
función show_self en una hebra arbitraria del objeto de depuración
cuando evalúa estas funciones, mientras se bloquean las demás hebras. Por lo
tanto, todas las llamadas que requieran la ejecución de otras hebras fallarán.
- Llamadas que dirigen la salida a la consola fallan de una forma relativamente
benigna, ya que simplemente no muestran salida.
- Existe una pequeña probabilidad de entrar en un punto muerto, porque muchas
funciones de biblioteca C/C++ (incluidas las funciones de entrada/salida y asignación
de memoria) necesitan llamar a código no reentrante protegido por un mútex.
- La función no puede llamar a o exec() - y no
puede terminarse la hebra
El
depurador intentará efectuar la recuperación si una de estas restricciones no se cumple. Sin
embargo, no puede garantizar que el estado de la aplicación que se depura no cambie de
forma irrevocable.