Comment gcc implémente-t-elle le déroulement de la pile pour les exceptions C++ sous Linux? En particulier, comment sait-il quels destructeurs appeler lors du déroulement d'une trame (c'est-à-dire, quel type d'information est stocké et où est-il stocké)?Comment gcc implémente-t-elle le déroulement de la pile pour les exceptions C++ sous Linux?
Répondre
Voir la section 6.2 de la x86_64 ABI. Ceci détaille l'interface mais pas beaucoup de données sous-jacentes. Ceci est également indépendant de C++ et pourrait également être utilisé à d'autres fins.
Il existe principalement deux sections du binaire ELF comme émis par gcc qui sont d'intérêt pour la gestion des exceptions. Ils sont .eh_frame
et .gcc_except_table
.
.eh_frame
suit le format DWARF (le format de débogage qui est principalement utilisé lorsque vous utilisez gdb). Il a exactement le même format que la section .debug_frame
émise lors de la compilation avec -g
. Essentiellement, il contient les informations nécessaires pour revenir à l'état des registres de la machine et de la pile à n'importe quel point plus haut dans la pile des appels. Voir le Standard Nain à dwarfstd.org pour plus d'informations à ce sujet.
.gcc_except_table
contient des informations sur la gestion des exceptions « aires d'atterrissage » les emplacements des gestionnaires. Ceci est nécessaire pour savoir quand arrêter le déroulement. Malheureusement, cette section n'est pas bien documentée. Les seuls extraits d'information que j'ai pu glaner proviennent de la liste de diffusion gcc. Voir en particulier this post
La partie restante de l'information est alors ce code réel interprète les informations contenues dans ces sections de données. Le code correspondant réside dans libstdC++ et libgcc. Je ne peux pas me rappeler pour le moment quelles pièces vivent dans lesquelles. L'interpréteur pour les informations de trame d'appel DWARF peut être trouvé dans le code source gcc dans le fichier gcc/unwind-dw.c
Bien que cela semble être pour les systèmes Itanium, sans doute la mise en œuvre est similaire pour x86: exception handling ABI
Il n'y a pas beaucoup de documentation actuellement disponible, mais le système de base est que GCC traduit essayer/blocs catch à function calls puis links in a library with the needed runtime support (documentation about the tree building code inclut l'instruction "lancer une exception n'est pas directement représentée dans GIMPLE, car elle est implémentée en appelant une fonction").
Malheureusement, je ne suis pas au courant de ces fonctions et ne peux pas vous dire ce qu'il faut regarder (autre que la source de libgcc - qui comprend le moteur d'exécution de la gestion des exceptions).
Il y a un document "Exception Handling for Newbies" disponible.
- 1. Déroulement de la pile sur HP-UX et Linux
- 2. Comment construire le GCC d'Apple sous Linux/Windows?
- 3. Comment associer des programmes C++ à la fonction de protection de pile de gcc sous AIX?
- 4. pile de noyau pour le processus linux
- 5. Linux Outil pour lire les valeurs de la pile
- 6. Modèles de gestion des exceptions de GCC
- 7. GCC sous Windows: Définir le champ "Description" de l'exécutable C?
- 8. Développer en C++ pour Windows CE sous Linux
- 9. Exceptions sous Linux à partir d'un objet partagé (.so)
- 10. Appel de pile dans la gestion des exceptions
- 11. compilation 64 noyau linux bits avec gcc
- 12. Comment diffuser UDP avec C sous Linux?
- 13. Héritage C++ pour les objets sur la pile
- 14. Code formateur/embellisseur pour C sous Linux pour utilisateur Emacs
- 15. Contrôle de la souris sous Linux
- 16. C++ & GCC: Comment l'implémentation C++ de GCC gère-t-elle la division par zéro?
- 17. (avr-gcc) Prise en charge Makefile pour les sous-répertoires
- 18. Construire un exécutable Linux en utilisant GCC
- 19. realloc en place avec gcc/linux
- 20. Utilisation de la bibliothèque C++ sous Linux (eclipse)
- 21. pile à virgule flottante manutention avec des exceptions en virgule flottante sous tension
- 22. IDE pour le débogage 'source C dans Linux
- 23. Exceptions d'interception pour la connexion à une application CLI C++
- 24. Suggestions pour localiser les exceptions
- 25. Implémentation d'une trace de pile sous Windows
- 26. Compilation d'un projet Objective-C sous Linux (Ubuntu)
- 27. C++ GCC 4.3.2 erreur sur le vecteur de char-tableau
- 28. Problèmes de pile lors de l'appel d'une DLL compilée avec Visual C++ dans GCC
- 29. Meilleures pratiques pour intercepter les exceptions de SQL en C#
- 30. comment gérer les exceptions dans DLL C# chargées par C++
GCC suit l'ABI Itanium dans la mesure du possible lorsqu'il n'y a pas d'ABI existant pour cette plate-forme. Cela inclut x86 et x86-64. – Branan