Question

Je sais que E & C est un sujet controversé et certains disent qu'il encourage une mauvaise approche de la mise au point, mais quand même - je pense que nous pouvons convenir qu'il ya de nombreux cas où il est clairement utile - expérimenter avec des valeurs différentes de certaines constantes, redessiner les paramètres de l'interface graphique sur la volée pour trouver un bon coup d'oeil ... Vous l'appelez.

Ma question est: Allons-nous jamais avoir E & C sur GDB Je comprends qu'il est une caractéristique spécifique à la plateforme et a besoin d'une coopération sérieuse avec le compilateur, le débogueur et le système d'exploitation (MSVC a ce facile que le compilateur et un débogueur sont toujours dans un seul paquet) , mais ... il devrait encore être faisable. J'ai même entendu quelque chose au sujet d'Apple l'avoir mis en œuvre dans leur version de GCC [citation nécessaire] . Et je dirais que c'est en effet possible.

Sachant tout, je suis sérieusement surpris le battage médiatique au sujet de MSVC E & C (utilisateurs mon expérience dit que c'est la première chose que MSVC mentionner quand on lui demande « pourquoi ne pas passer à Eclipse et gcc / GDB » ) que, après tout à fait quelques années GCC / GDB n'a toujours pas cette fonction. Y at-il de bonnes raisons pour cela? Est-ce que quelqu'un travaille là-dessus que nous parlons?

Était-ce utile?

La solution

Il est une quantité étonnamment non négligeable du travail, qui englobe de nombreuses décisions de conception et de longs compromis. Considérez: vous déboguez. Le debugee est suspendu. Son image en mémoire contient le code objet de la source, et la mise en page binaire d'objets, le tas, les piles. Le débogueur inspecte l'image de la mémoire. Il contient des informations de débogage chargé sur les symboles, les types, les correspondances d'adresse, pc (ip) aux correspondances source. Il affiche la pile d'appel, les valeurs de données.

Maintenant que vous souhaitez autoriser un ensemble de modifications possibles au code et / ou de données, sans arrêter le debuggee et le redémarrage. Le plus simple est peut-être changer une ligne de code à l'autre. Peut-être vous recompiler ce fichier ou tout simplement cette fonction ou tout simplement cette ligne. Maintenant, vous devez patcher l'image débogué pour exécuter cette nouvelle ligne de code la prochaine fois que vous faites un pas dessus ou autrement courir à travers elle. Comment cela fonctionne sous le capot? Qu'advient-il si le code est plus grand que la ligne de code a remplacé? Comment ça interagit-il avec les optimisations du compilateur? Peut-être que vous ne pouvez le faire sur un spécialement compilé pour la cible de débogage EnC. Peut-être vous limiter les sites possibles, il est légal de EnC. Considérez: ce qui se passe si vous modifiez une ligne de code dans une fonction suspendue dans la pile d'appels. Lorsque le code retourne, il ne fonctionner la version originale de la fonction ou la version avec ligne modifiée? Si la version originale, d'où provient cette source de?

Pouvez-vous ajouter ou supprimer des habitants? Qu'est-ce que faire pour la pile d'appels de cadres suspendus? De la fonction actuelle?

Pouvez-vous modifier les signatures de fonction? Ajouter des champs à des champs / REMOVE des objets? Qu'en est-il des instances existantes? Qu'en est-il dans l'attente ou finalizers Destructeurs? Etc.

Il y a beaucoup, beaucoup de détails de la fonctionnalité pour assister à faire toute sorte de travail usuable enc. Ensuite, il y a beaucoup de problèmes d'intégration croisée des outils nécessaires pour fournir l'infrastructure au pouvoir EnC. En particulier, il est utile d'avoir une sorte de référentiel d'informations de débogage qui peuvent mettre à disposition les informations et de avant- débogage après modification et code objet au débogueur. C ++, les informations de débogage progressivement dans actualisable PDB aide. liaison supplémentaire peut aider aussi.

Vous cherchez des MS écosystème sur dans l'écosystème GCC, il est facile d'imaginer les problèmes de complexité et d'intégration à travers GDB / GCC / binutils, la myriade de cibles, des abstractions cibles spécifiques enc nécessaires, et la « agréable d'avoir, mais nature inessentiel » de EnC, sont la raison pour laquelle il n'a pas encore paru dans GDB / GCC.

Happy Hacking!

(ps Il est instructif et inspirant à regarder ce que l'environnement de programmation interactif Smalltalk-80 pourrait faire en ST80 il n'y avait pas de concept de « redémarrage » -. L'image et la mémoire d'objets étaient toujours en direct, si vous avez modifié une aspect d'une classe que vous aviez toujours continuer à courir. Dans de tels environnements objet versioning était pas hypothétique.)

Autres conseils

Je ne suis pas familier avec E & C MSVC, mais GDB a quelques-unes des choses que vous avez mentionnés:

http://sourceware.org/gdb/current/onlinedocs /gdb/Altering.html#Altering

  

17. Exécution altérant

     

Une fois que vous pensez que vous avez trouvé une erreur dans votre programme, vous pouvez savoir avec certitude si corriger l'erreur apparente conduirait à des résultats corrects dans le reste de la course. Vous pouvez trouver la réponse par l'expérience, en utilisant les fonctions de gdb pour modifier l'exécution du programme.

     

Par exemple, vous pouvez stocker de nouvelles valeurs dans des variables ou des emplacements de mémoire, donnez votre programme un signal, redémarrez-le à une adresse différente, ou même revenir prématurément d'une fonction.

     

Affectation : Affectation aux variables
   Saut : Continuant à une adresse différente
   Signaling : Donner votre programme un signal
   retour : retour d'une fonction
   Appel : fonctions Appeler votre programme
   Correctif : patcher votre programme
   Compiler et code Injecter : Compiler et injection de code dans GDB

Ceci est une très bonne référence à l'ancienne implémentation d'Apple « fix et continuer ». Il fait également référence à d'autres implémentations de travail.

http://sources.redhat.com/ml/gdb/ 2003-06 / msg00500.html

Voici un extrait:

  

Fix et continuer est une fonctionnalité mise en œuvre par de nombreux autres débogueurs,   que nous avons ajouté à notre gdb pour cette version. Atelier Sun, SGI ProDev   WorkShop, Visual Studio de Microsoft, la wdb de HP, et Hotspot Java de Sun   VM fournir toute cette fonction d'une manière ou d'une autre. Je me suis basé notre   la mise en œuvre sur le wdb de HP Fix et continuer fonction, qu'ils   ajouté quelques années. Bien que ma mise en œuvre finale suite à la   grandes lignes de l'approche qu'ils ont, il n'y a presque pas partagé   code entre eux. Une partie de c'est à cause de la architectual   les différences (à la fois le processeur et le ABI), mais plus encore de celui-ci est   en raison des différences de conception de mise en œuvre.

Notez que cette capacité peut avoir été supprimée dans une version ultérieure de leur toolchain.

Mise à jour: Dec-21-2012 Il y a une présentation PDF GDB feuille de route qui comprend une diapositive décrivant « Fix et continuer », entre autres points de balle. La présentation est datée Juillet-9-2012 alors peut-être il y a espoir d'avoir ce ajouté à un moment donné. La présentation faisait partie du Outils GNU Cauldron 2012 .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top