Cela fait longtemps que je ne me suis pas intéressé à ce genre de choses, mais en supposant que vous ayez raison de pousser l'adresse suivante sur la pile, le débogueur peut afficher l'adresse de retour et l'utiliser pour déterminer le point d'arrêt était (l'adresse de retour moins un, puisque l'instruction INT 3 est longue d'un octet) [édité]. En d'autres termes, le débogueur n'a pas nécessairement besoin de retourner à l'adresse sur la pile. Il peut restaurer l'instruction d'origine, puis l'exécuter à l'emplacement d'origine. Si le point d'arrêt doit rester positionné, il peut utiliser le "bit de piège" dans les drapeaux pour n'exécuter qu'une seule instruction - l'originale qui a été écrasée - avant qu'un autre trap ne soit généré (INT 3 encore je pense); alors l'instruction INT 3 peut être rétablie avant de poursuivre l'exécution correctement.
La plupart du temps, cependant, les débogueurs fonctionnent dans un système où ils ne sont pas directement manipuler le piège de toute façon; ils pourraient être délivrés un signal, par exemple, en leur disant où le piège s'est produit. Très probablement, ils doivent encore trouver l'adresse "réelle" (c'est-à-dire l'adresse de l'instruction INT3) à partir de l'adresse d'interruption, car le système d'exploitation n'a aucun moyen de le faire.
Les choses se compliquent aussi, s'il y a plusieurs threads impliqués; dans ce cas, la restauration de l'instruction d'origine "en place" peut entraîner l'absence du point d'arrêt s'il est frappé par un autre thread. Une solution pourrait être d'arrêter tous les autres threads avant de restaurer l'instruction (et de les redémarrer ensuite).
Quelqu'un peut-il citer le code source de GDB? :-) –