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 ?

0
Ruslan 11 sept. 2018 à 13:12

1 réponse

Meilleure 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. Et queue-signal ne peut pas être utilisé pour transmettre un signal dont l'état de traitement a été défini sur nopass.

2
Community 20 juin 2020 à 12:12