Comment savoir où est l'erreur dans un exe ? [Résolu]

Signaler
Messages postés
898
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
22 mai 2021
-
Messages postés
898
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
22 mai 2021
-
Bonjour,
J'ai mis à disposition un programme VB6 après l'avoir compilé; c'est donc un .exe.
Un utilisateur me signale une erreur 13 type mismatch.
Je sais ce que ça signifie mais ça peut être n'importe où dans le programme.
J'essaye de reproduire le même cas mais chez moi ça ne plante pas, ni dans la version vbp, ni dans la version exe.

Comment puis-je savoir sur quelle instruction le programme se plante ?

Question subsidiaire : je suis en win 7/64, lui en win 8.1 : ceci peut-il être une raison ?

Merci d'avance pour votre aide

10 réponses

Messages postés
14799
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
6 juin 2021
155
Tu peux aussi numéroter tes lignes :
MsgBox ...
Devient par exemple :
210 MsgBox ...

Ensuite dans ton message d'erreur, tu utilises la variable ERL qui indiquera le numéro de la ligne incriminée.
Messages postés
14799
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
6 juin 2021
155
Tentes de gérer l'erreur avec On Error.
VB6 est très peu bavard concernant la pile des appels.
Messages postés
898
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
22 mai 2021
2
Bonjour,
Pour qu'un message en dise plus que "type mismatch" je pensais effectivement gérer moi-même on error.
Je me suis mal exprimé.
Comment puis-je savoir dans cette routine d'interception d'erreur sur quelle instruction le programme se plante pour le mettre dans une msgbox ?
Messages postés
16024
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
12 juin 2021
549
Bonjour, il y a longtemps que je n'ai pas fait de VB6, il me semble le souvenir que si on place le On Error au point d'entrée du programme, l'instruction est valable pour toute fonction ou procédure appellée ensuite, et ainsi n'écrire qu'une procédure de gestion d'erreur.
Si cela est bien possible, tu peux dimensionner une variable globale de type string, à chaque début de Sub tu écris dedans le nom de la sub, les paramètres, et le nom de la sub qui appelle celle ci(en la récupérant dans la valeur précédente de ta variable.
Dans la gestion d'erreur tu afficheras un message d'erreur qui donneras ces informations. Tu peux aussi écrire un petit log avec ces infos.

Si cela ne suffit pas tu peux alors écrire un log à chaque début ou fin de sub avec les mêmes données ou plus si tu le souhaites afin de suivre pas à pas ce qui se passe.



Posté depuis CCM Live forum pour iPhone/iPad
Messages postés
898
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
22 mai 2021
2
... sans oublier que lorsqu'on sort d'une Sub il faut remettre dans la variable le nom de celle qui l'a appelé.
La difficulté est que le programme contient 210 Sub
et surtout que si une Sub appelle une Sub qui appelle une Sub ... une variable ne suffit plus, il faut faire une gestion de pile !

N'y a-t-il vraiment aucune info qu'on puisse récupérer dans un module on error ?
Messages postés
16024
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
12 juin 2021
549
Non je ne te proposais pas de tout mette bouta bout, juste ce qui concerne la sub en cours et qui l'a appelé.
Tu écrases le contenu à chaque fois.
Après si tu en as 210 à modifier je comprends que tu préfères une autre solution
Messages postés
898
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
22 mai 2021
2
Le problème est que lors de l'exit sub il faut remettre la sub en cours, la précédente en fait, et celle qui l'a appelé, la précédente de la précédente, donc il faut une gestion de pile.
Et puis le fait de connaître la sub en cours serait déjà en effet pas mal, de la à connaître le statement qui pose problème ...
Messages postés
898
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
22 mai 2021
2
J'ai raté la réponse concernant Try ... Catch : on n'est pas en VB.net là !

Numéroter les lignes est une excellente idée.
Est-il possible de numéroter les lignes automatiquement sans devoir écrire un nombre devant chacune d'elles ?
Messages postés
14799
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
6 juin 2021
155
Oui, avec l'addin MZTools (gratuit pour VB6/VBA).
Messages postés
898
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
22 mai 2021
2
J'ai cet addin; je n'avais pas remarqué qu'il pouvait ajouter des n° de ligne uniques sur tout un projet; ainsi je peux identifier exactement la ligne où une erreur s'est produite; déjà un grand merci !
Question subsidiaire : j'ai 15 Forms avec leur code dans ce projet; l'une d'elles est toujours chargée; dois-je ajouter un error handler dans chaque form ou est-il possible d'ajouter un seul "on error goto" soit vers le code de la Form qui est toujours chargée soit vers un module commun ?
Messages postés
14799
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
6 juin 2021
155
Il faut ajouter un On Error à toutes les fonctions de base au moins (Timer1_Timer, Command1_Click, ...)
Messages postés
898
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
22 mai 2021
2
Veux-tu dire toutes les sub déclenchées par un évènement comme _Click, _Change, _Mousedown, _Load, ...
mais pas les sub appelées comme des sous-routines ou des fonctions ?
Dans ce cas que se passe-t-il en cas d'erreur dans un de ces modules; est-ce le on error de la sub qui l'a appelé qui reste valide ?
Ou alors faut-il on error sur les routines aussi ?
Messages postés
2429
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 juin 2021
137
Salut Herve_be !
Et si tu demandais à cet utilisateur dans quel cas précis et avec quelles valeurs si il y a ce message d'erreur se produit !
Ne serait-ce pas plus constructif !
Messages postés
898
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
22 mai 2021
2
C'est évidemment la première chose que j'ai faite.
Le problème est que je ne parviens pas à reproduire la même chose chez moi, comme indiqué dans ma question initiale.
Messages postés
2429
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 juin 2021
137
salut Herve_be
Le problème n'est pas de reproduire la même chose chez toi mais de comprendre pourquoi ce problème arrive chez lui et pas chez toi !
Ce n'est pas du aux 32 bits ou 64 bits de Windows car si mes souvenirs sont bons VB6 est uniquement 32 bits !
Est-ce dû aux problèmes de compatibilté de VB6 avec Windows 8.1 ? Ton Exe touche -t-il à des "zones sensibles" de Windows (base de registre, dosiers système ou autre " ?
Cet utilisateur exécute-t-il cet exe en tant qu'administrateur ?
Quelles sont les actions exactes qui amènent l'erreur chez cet utilisateur ?
Messages postés
32944
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 juin 2021
351
Bonjour,

Question subsidiaire : je suis en win 7/64, lui en win 8.1 : ceci peut-il être une raison ?
Oui... ça peut venir de DLL que tu aurais mis dans ton prog ou simplement par exemple.

Pour ce qui est de trouver où est l'erreur... je ne vais pas revenir sur tout ce que les autres t'ont proposés.... j'ajouterai seulement qu'il te suffit de faire une recherche à Grosse maille pour essayer de trouver où se trouve le souci... puis une fois la/les Sub identifées d'affiner ta recherche...


Messages postés
898
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
22 mai 2021
2
Bonjour,
J'ai donné à cet utilisateur une version avec gestion d'erreur uniquement dans le code de la form qui pose problème et ... bingo : message d'erreur avec le n° de ligne concernée.
if Surface <> 0 then ...
"Surface" est le nom d'une Textbox ce qui explique l'erreur.
A ma prochaine intervention ici je mettrai donc le problème comme résolu.
Je ne comprends cependant pas pourquoi elle ne se produit pas chez moi !
Messages postés
2429
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 juin 2021
137
Salut Herve_be
Tu dis "Je ne comprends cependant pas pourquoi elle ne se produit pas chez moi ! "
C'est bien tout le problème !
As-tu mis Option Explicit dans les options générales du projet ? dans le cas contraire c'est possible que VB fait en sorte de prendre la valeur numérique inscrite dans la Textbox et ne déclenche pas l'erreur chez toi !
Est-ce la seule erreur dans ce projet ?
Messages postés
898
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
22 mai 2021
2
Non je n'ai pas d'option explicit.
J'avoue que c'est une erreur de ne pas déclarer les variables, mais il y en a tellement maintenant que ce serait vraiment très fastidieux.

Est-ce la seule erreur ?
Je n'en sais rien, en tout cas 750 personnes ont téléchargé mon ensemble de programmes, autant dire qu'il a été pas mal trituré en plus des tests que j'ai faits moi-même, et c'est la première fois qu'on me relate cette erreur.
Je trouve quand même bizarre que VB prend la valeur numérique chez 749 utilisateurs, chez moi aussi, et pas chez un utilisateur en particulier !

Toujours est-il que ma question initiale
Comment puis-je savoir sur quelle instruction le programme se plante ?
est résolue et que je vais maintenant mettre cette gestion d'erreur dans tous les évènements.
Un tout grand merci pour votre aide.
Messages postés
2429
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 juin 2021
137
Dommage que tu n'ais pas déposé le projet en tant que source sur le site !
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
50
Bonjour

normalement tu aurais du trouver l'erreur chez toi aussi
verifie ton code s'il n y a pas d'autre erreurs du meme genre .

Avec le vb.net tu aurais une erreur de compilation ,l'un des inconvénients du vb6 tout passe à la compilation et après à toi de jouer.....
Messages postés
898
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
22 mai 2021
2
Je suis conscient que VB6 est un vieux machin.
Mais tout comme il serait fastidieux de déclarer toutes les variables, je n'imagine pas convertir tout ça en VB.net !
Toujours est-il que lorsque j'aurai intercepté les éventuelles erreurs dans les 210 évènements (MZ-tools facilite quand même bien la tâche pour ajouter le code nécessaire) il sera facile de les corriger.