Les restrictions sur les appels de fonctions et la fonction show_self sont les suivantes :
- Ils ne permettent pas d'appeler exec().
- Ils ne permettent pas d'arrêter l'unité d'exécution ou le processus.
- Ils ne permettent d'émettre aucun signal.
- Ils ne permettent pas d'appeler longjmp() sauf si la cible de longjmp() se trouve
à l'intérieur de la fonction.
- Ils ne permettent d'émettre aucune exception C++, sauf si celle-ci est traitée à l'intérieur de la fonction.
- Ils doivent s'arrêter au bout d'un délai raisonnable. Ce délai est contrôlable via la variable d'environnement DER_DBG_SHOWSELF_TIMEOUT. La valeur par défaut est 10 secondes.
- Dans une application comportant plusieurs unités d'exécution, la fonction ne peut rien supposer sur l'unité d'exécution où elle s'exécute. Elle doit considérer que toutes les autres unités d'exécution du processus ont été interrompues. En particulier :
- La fonction ne doit pas dépendre des autres unités et doit partir du principe que les autres unités ont sans doute verrouillé des ressources requises. Notamment, l'appel de pthread_mutex_lock() risque d'entraîner un blocage de la fonction.
- Toutes les fonctions de bibliothèque C/C++ ne sont pas réentrantes. Bon nombre de fonctions autorisant les unités d'exécution multiples dans libc.a, y compris les fonctions d'affectation de mémoire et d'entrée-sortie, ne sont pas réentrantes. Elles sont réutilisables en série. Ces fonctions utilisent pthread_mutex_lock() pour mettre en oeuvre
le niveau de réutilisation en série. Lorsque vous les appelez, le risque de blocage de la session de débogage est donc faible.
- Toutes les modifications apportées par la fonction à l'état général du processus du programme en cours de débogage resteront en place après le retour de la fonction.
- Les conséquences d'un appel de la fonction pthread_create() ne sont pas définies.
- La fonction show_self inclut les appels qui dirigent la sortie vers la
console. Ces appels incluent printf(), fprintf() et la
classe cout. Pendant l'évaluation de ces fonctions, le débogueur exécute
la fonction show_self sur une unité d'exécution
arbitraire du programme à déboguer, tandis que toutes les autres unités d'exécution sont gelées. Par conséquent, tout appel nécessitant l'activité d'autres unités d'exécution échouera.
- Les appels qui dirigent leur sortie vers la console échouent de manière relativement bénigne, dans la mesure
où il n'y a tout simplement pas de sortie.
- Il existe un faible risque d'interblocage, car de nombreuses
fonctions de bibliothèque C/C++
(y compris les fonctions d'entrée/sortie et d'allocation de
mémoire) ont besoin d'appeler du code non réentrant qui est protégé par un mutex.
- La fonction ne peut pas appeler ou exec() -
et elle ne peut pas terminer l'unité d'exécution.
Le débogueur tentera une restauration si une de ces restrictions n'est pas respectée. Cependant, il ne constitue aucune garantie contre les modifications irrévocables de l'application en cours de débogage.