Supposons qu'un processus exécuté sous GDB s'arrête en raison de la réception d'un signal, par ex. SIGSEGV
en raison de l'accès à un emplacement non valide. Je fixe ensuite l'emplacement (en écrivant dans un registre ou de toute autre manière) et je souhaite procéder en une seule étape en réessayant l'instruction défaillante.
Il existe une commande stepi
, qui fonctionnerait si le signal était ignoré ou n'avait pas été reçu en premier lieu. Mais comme il y a un signal en attente, je ne peux pas l'utiliser, du moins directement. Si j'utilise la commande signal 0
, elle ignorera le signal, mais elle fonctionnera alors comme continue
. Ainsi, si j'utilise signal 0
, je dois savoir où commence la prochaine instruction, ajouter un tb
dessus, etc. Ce n'est pas pratique.
Une autre façon serait comme handle SIGSEGV ignore
suivi de stepi
suivi d'une autre commande handle
pour restaurer son état d'origine. Aussi pas pratique : ne peut même pas define
une fonction "boîte noire" pour cela, car l'état d'origine de la gestion du signal peut être différent de celui par défaut, et il aura du mal à le restaurer après si
.
Alors, existe-t-il un moyen simple de supprimer le signal en attente sans poursuivre l'exécution ?
1 réponse
Dans gdb version 7.9 et versions ultérieures, il est une commande queue-signal
qui vous permettra d'envoyer un signal (ou aucun signal du tout, si vous lui donnez 0
comme argument) la prochaine fois que la cible est reprise. Voici une partie de la documentation :
File d'attente signal à envoyer immédiatement au thread actuel lorsque l'exécution du thread reprend. Le signal peut être le nom ou le numéro d'un signal. La gestion du signal doit être définie pour transmettre le signal au programme, sinon GDB signalera une erreur. Vous pouvez contrôler le traitement des signaux de GDB avec la commande
handle
.Alternativement, si signal est égal à zéro, tout signal actuellement en file d'attente pour le thread actuel est rejeté et lorsque l'exécution reprend, aucun signal ne sera délivré.
Cette commande diffère de la commande
signal
en ce que le signal est juste mis en file d'attente, l'exécution n'est pas reprise. Etqueue-signal
ne peut pas être utilisé pour transmettre un signal dont l'état de traitement a été défini surnopass
.
Questions connexes
De nouvelles questions
gdb
Utilisez cette balise pour les problèmes liés à ou impliquant GDB, le débogueur standard pour le système logiciel GNU.