Est-il possible de récupérer la pile d'appels par programme dans VB6?
Lorsqu'une erreur se produit dans une fonction, je voudrais connaître la séquence des événements qui conduisent à elle, en particulier lorsque cette fonction est appelée depuis une douzaine d'endroits différents. Est-il possible de récupérer la pile d'appel en VB6, ou dois-je le faire à la dure (par exemple, les entrées de journal dans chaque fonction et de gestionnaire d'erreur, etc.)?
source d'informationauteur raven
Vous devez vous connecter pour publier un commentaire.
Je suis sûr que vous avez à faire à la dure. Lors d'un précédent travail de la mine, nous avons eu un très élégant processus de gestion des erreurs pour VB6 avec des composants DCOM. Cependant, il a été beaucoup de code redondant qui a dû être ajoutée pour chaque méthode, si bien que nous avons eu à la maison-grandi outils pour insérer tout pour vous.
Je ne peux pas fournir trop de perspicacité sur sa mise en œuvre (à la fois parce que j'ai oublié la plupart de ce qu'il y'a une chance qu'ils peuvent la considérer comme un secret commercial). Une chose qui ne se démarquent était que le nom de la méthode ne pouvait pas être dérivé au moment de l'exécution, de sorte qu'il a été ajouté comme une variable de chaîne (certains développeurs de copier-coller au lieu d'utiliser l'outil et il conduirait à une erreur de piles qui ont menti...).
HTH
Vous avez à faire à la dure, mais ce n'est pas vraiment tous les que dur... Sérieusement, une fois que vous avez écrit sur le modèle une fois, c'est un rapide copier/coller/modifier pour correspondre le nom de la fonction dans le Tre.Instruction Raise à la fonction en elle même nom.
Lorsque vous avez des appels imbriqués, cela se déroule comme chaque routine frappe son maître et ajoute son nom à la description de l'erreur. Au niveau supérieur de la fonction, vous obtenez un "call stack" affichage de la liste des routines qui ont été appelés, et le nombre d'erreur et la description de l'erreur qui a effectivement eu lieu. Il n'est pas parfait, que vous ne recevez pas les numéros de ligne, mais j'ai trouvé que vous n'avez généralement pas besoin d'eux pour trouver votre chemin vers le problème. (Et si vous voulez vraiment les numéros de ligne, vous pouvez les mettre dans la fonction et la référence dans le Tre.Instruction Raise à l'aide de la variable Erl. Sans les numéros de ligne, qui ne renvoie 0.)
Aussi, notons qu'au sein de la fonction elle-même, vous pouvez élever vos propres erreurs avec les valeurs des variables intéressantes dans le message de la sorte:
(La coloration syntaxique semble bancale dans l'aperçu... je me demande comment sera t'il quand il est affiché?)
À la dure, de façon manuelle est à peu près la seule façon. Si vous découvrez cette question, quelqu'un a suggéré un outil appelé MZTools qui va faire beaucoup de la gros du travail pour vous.
Que d'autres ont dit (il y a des années, je vois... mais il y a beaucoup de gens encore à l'aide de VB6! 🙂 ), Je pense qu'il n'est pas possible de récupérer par programmation de la Pile d'Appel, sauf si vous utilisez un outil de la 3e partie.
Mais si vous avez besoin de le faire à des fins de débogage, vous pouvez envisager d'ajouter à la routine appelée une Option de chaîne d'entrée variable, ont été vous allez mettre le nom de l'appelant.
Pas aussi élégant, peut-être, mais il a travaillé pour moi.
Ce qui concerne,
Max - Italie
Compuware (ou était-ce Numega à l'époque) DevStudio pour Visual Basic 6 utilisé pour ce faire. Le chemin est par l'adjonction de l'ajout de instrumenation à chaque appel, qui a appelé à un très petit extrait qui a ajouté à la pile du code. Sur une erreur, il sous-évaluées que de la pile, puis a fait des choses comme mail ou par courrier à un serveur web toutes les informations de débogage. Ajout et suppression de l'instrumentation a été potentiellement mortelle fonctionnement (en particulier à l'époque, quand nous étions à l'aide de VSS, comme source de contrôle), mais si cela fonctionne, cela fonctionne bien.
Comme Darrel a soulignévous pouvez ajouter quelque chose de très simlar en utilisant MZTools et mise en place d'un modèle. C'est beaucoup de travail, et est probablement plus effeort que la récompense serait, mais si vous avez très difficile de traquer les bugs, il pourrait aider).