Page 1 sur 3

[Ex] Retrouver la ligne d'erreur d'un script compilé

Posté : mar. 27 mars 2012 16:26
par TommyDDR
Bonjour,

Vous vous êtes surement tous confronté au problème suivant :
  • Vous codez une application
  • Vous la lancez en tant que script pour corriger tous les éventuels bugs
  • Vous vous décidez de le compiler et l'utiliser de façon normal
  • C'est là qu'une erreur bien caché fait son apparition et vous vous retrouvez avec un message du type :
    Error.JPG
    Error.JPG (9.88 Kio) Vu 22588 fois
Malheureusement votre code ne contient même la ligne 1745.

En effet, une fois compilé, toutes les lignes #include "XXXXX" sont supprimé et remplacé par le code des dit fichiers, c'est pourquoi la ligne d'erreur indiqué est beaucoup plus grande une fois le script compilé.

J'ai donc créé un script qui permet de connaitre le fichier et la ligne de ce fichier concerné par l'erreur.

Mode d'emploi :
1) Lancer le script
2) Indiquer le nom du fichier PRINCIPAL de votre script
3) Indiquer le numéro de ligne d'erreur indiqué par le programme COMPILÉ
4) Vous voila avec le nom du fichier concerné ainsi que le numéro de la ligne fautive du plantage.

PS : Il est nécessaire d'avoir en votre possession le code source du script, et qu'il soit en accord avec la version compilé (pas de modifications du code après compilation)
Le code n'est pas commenté :D

[attachment=3]GetRealErrorLine.au3[/attachment]
OneFileScript.au3
(4.6 Kio) Téléchargé 674 fois
GetRealErrorLine.au3
(853 Octets) Téléchargé 659 fois
Exemple.au3
(1.73 Kio) Téléchargé 659 fois

Re: [Ex] Retrouver la ligne d'erreur d'un script compilé

Posté : mar. 27 mars 2012 16:41
par sksbir
ça, c'est ..... excellent !! 8)

Parce que , l'avantage d'autoit, c'est d'obtenir des exécutables autonomes. Il m'arrive souvent d'écrire des scripts que je ne lance même pas sur la machine où j'écris le script, mais sur une autre machine sur laquelle je ne veux pas installer autoit ni scite. Du coup, quand ça plante, le déboggage était très chaud à faire.
Ton outils va donc me servir

Re: [Ex] Retrouver la ligne d'erreur d'un script compilé

Posté : mar. 27 mars 2012 19:33
par TopXm
Hello TommyDDR,

En effet cela est une excellent idée.

Juste un "petit bémol", c'est dommage que ça ne prenne pas en compte la "User Include Dir" qu'on peut définir dans Scite (CTRL+1), car ce dossier est bien pratique pour y coller ses propres fonctions qu'on utilise régulièrement.

Du coup je me suis permis d'ajouter quelques lignes dans le script
Au niveau du 1er Global

Code : Tout sélectionner

Global $UserIncludeDirectory = RegRead("HKEY_CURRENT_USER\SOFTWARE\AutoIt v3\AutoIt", "Include")
If $UserIncludeDirectory = "" Then $UserIncludeDirectory = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3\AutoIt", "Include")
If $UserIncludeDirectory <> "" And FileExists($UserIncludeDirectory) Then $UserIncludeDirectory &= '\'
 
Et dans la Func CalculeRealLigne() j'ai modifié les FileExist() pour ajouter $UserIncludeDirectory

Code : Tout sélectionner

    If(Not(FileExists($PathUsed & $Fichier))) Then
        If $UserIncludeDirectory <> '' Then
            $PathUsed = $UserIncludeDirectory
        EndIf
    EndIf
    If(Not(FileExists($PathUsed & $Fichier))) Then
        $PathUsed = $ScriptDir
    EndIf
    If(Not(FileExists($PathUsed & $Fichier))) Then
        Local $TabEmpty[2] = [0, ""]
        Return SetError(1, 0, $TabEmpty)
    EndIf
 
Vu que l'ordre de recherche des .au3 semble être :
  1. Le dossier Include d'AutoIT
  2. Le dossier Include défini par l'utilisateur (si défini)
  3. Le dossier du script en cours
Bon après possible que ça n'intéresse que moi :)

Re: [Ex] Retrouver la ligne d'erreur d'un script compilé

Posté : mer. 28 mars 2012 09:50
par TommyDDR
En effet, je n'avais pas pensé au dossier include utilisateur

Je ne l'utilise pas car lors d'export d'un script, il faut pensé que certains includes sont situé dans ce dossier.
De cette manière, je n'ai qu'à copier le dossier du script pour que celui-ci soit fonctionnel.

J'ajoute votre modification au script ;)

Pour Info :
#include "test.au3" -> Recherche : Dossier courant puis dossier include
#include <test.au3> -> Recherche : Dossier include puis dossier courant

Edit : Je n'ai pas de clé Include dans HK_CRRENT_USER et même en l'ajoutant, autoit ne le prend pas en compte. Comment AutoIt connait-il les dossier d'includes ?

Re: [Ex] Retrouver la ligne d'erreur d'un script compilé

Posté : jeu. 29 mars 2012 13:55
par ricky
Hello,

super utile ton code. Merci du partage

Re: [Ex] Retrouver la ligne d'erreur d'un script compilé

Posté : sam. 31 mars 2012 14:06
par TopXm
Hello TommyDDR :)
TommyDDR a écrit :Pour Info :
#include "test.au3" -> Recherche : Dossier courant puis dossier include
#include <test.au3> -> Recherche : Dossier include puis dossier courant
Ah tiens merci, je ne connaissais pas cette information :)
TommyDDR a écrit :Edit : Je n'ai pas de clé Include dans HK_CRRENT_USER et même en l'ajoutant, autoit ne le prend pas en compte.
A priori la clé n'est créée que lorsque l'on renseigne l'information dans Scite. Elle est bien présente sur mon PC.
TommyDDR a écrit :Comment AutoIt connait-il les dossier d'includes ?
Ben j'ai récupéré le bout de code dans SciteConfig.au3 du dossier C:\Program Files\AutoIt3\SciTE\SciTEConfig ligne 214/215 ;)

Re: [Ex] Retrouver la ligne d'erreur d'un script compilé

Posté : mar. 03 avr. 2012 16:05
par sksbir
hello
Le programme m'indique une ligne en erreur qui ne correspond pas tout à fait : exemple : il me dit 2057, et c'est la ligne 2059 qui est en erreur. ( note pour moi : N° d'origine : 6783)

Re: [Ex] Retrouver la ligne d'erreur d'un script compilé

Posté : mar. 03 avr. 2012 16:09
par wello
salut

...hum, ça va bien me servir je pense. En tout cas si ça peut nous faire gagner un temps précieux, c'est pas négligeable.

merci c'est cool je garde ton code sous le coude 8)

Re: [Ex] Retrouver la ligne d'erreur d'un script compilé

Posté : mar. 03 avr. 2012 18:06
par TommyDDR
Les joies du partage libre :)

Et si cela vous fait plaisir, ça me fait plaisir ;)

Re: [Ex] Retrouver la ligne d'erreur d'un script compilé

Posté : mar. 05 juin 2012 11:16
par ricky
Hello,

j'ai une erreur, je comprends pas pourquoi :

C:\Documents and Settings\rc\Bureau\AutoIt SourceCode\GetRealErrorLine.au3 (74) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
$Temp = StringSplit($Temp[1], $Chars[1], 3)
$Temp = StringSplit(^ ERROR

Merci d'avance pour ton aide.

Re: [Ex] Retrouver la ligne d'erreur d'un script compilé

Posté : mar. 05 juin 2012 23:12
par TommyDDR
Votre question doit faire l'objet d'une demande à part entière. Elle n'a rien à faire ici. De plus, "Array variable has incorrect number of subscripts or subscript dimension range exceeded." en dit long sur le pourquoi cela plante.

Re: [Ex] Retrouver la ligne d'erreur d'un script compilé

Posté : mer. 06 juin 2012 09:47
par ricky
Hello,
pourquoi ça doit faire une demande à part entière? C'est le script fourni au premier topic qui ne marche pas!

Re: [Ex] Retrouver la ligne d'erreur d'un script compilé

Posté : mer. 06 juin 2012 17:17
par TommyDDR
Aaaah, c'était une erreur dans mon programme :P
Je ne l'avais pas compris comme ça, envoyez les sources du programme concerné pour que je puisse me pencher dessus.

Re: [Ex] Retrouver la ligne d'erreur d'un script compilé

Posté : lun. 18 août 2014 17:38
par Jerem
Bonjour,

Je suis tombé sur ce topic en cherchant une solution au message d'erreur que je reçois sur mon programme compilé.

J'ai cru que ça allait me sauver la vie, mais malheureusement le programme ne semble pas fonctionner sur mon PC.
J'ai modifié le code afin de l'adapter à mon environnement (la clé de registre sur Win8 64 bits est différente et j'ai ajouté la troisième case "false" lorsque le fichier n'est pas trouvé pour éviter l'erreur d'array number of subscripts) mais la ligne retournée correspond au fichier WinAPI, je doute qu'il y ait une erreur dans ce fichier; d'autant que la ligne ne correspond pas à l'erreur retournée. :P

Bref ma question est la suivante : Le programme fonctionne-t-il avec des programmes compilés en 64 bits ?

Re: [Ex] Retrouver la ligne d'erreur d'un script compilé

Posté : mar. 19 août 2014 10:13
par TommyDDR
Cela fait pas mal de temps que je ne m'en suis pas servi, le programme à été codé avec une ancienne version d'autoit, si la compilation à changé (mais j'en doute) il ne fonctionnera plus, si cela ne vous dérange pas, pouvez vous fournir les sources ?

Re: [Ex] Retrouver la ligne d'erreur d'un script compilé

Posté : mar. 19 août 2014 15:33
par Jerem
Bonjour,

Merci d'avoir répondu alors que le message d'origine à plus de deux ans.

Je ne peux pas fournir les sources en l'état, il faudrait que j'enlève certaines informations relatives à mon entreprise.
De même le code fourni ne sera pas fonctionnel sur un environnement qui ne correspond pas au mien. À priori cela ne devrait pas poser de problème pour vérifier le fonctionnement du programme de détection de ligne, mais j'aimerai en être sûr avant de me lancer dans la modification des informations confidentielles.

Merci.

Re: [Ex] Retrouver la ligne d'erreur d'un script compilé

Posté : mar. 19 août 2014 15:54
par TommyDDR
Le problème vient peut être d'une subtilité que j'aurais oublié, ce qui décalerait les lignes...
Sans le code il sera compliqué de vous aider.
Le code n'a pas besoin d'être exécuter, il faut juste s'assurer que le problème persiste après avoir modifié les infos.

Re: [Ex] Retrouver la ligne d'erreur d'un script compilé

Posté : mar. 19 août 2014 16:12
par Jerem
Finalement modifier le source aura été plus rapide que je ne le pensais.
L'erreur se produit toujours.

La ligne indiqué par le programme compilé est la ligne 2901.
La ligne réelle indiquée est la ligne 2933 de WinAPI.

Le fichier zip contient le code principale.
Les fichiers contenant des fonctions (dont certains sont à placer dans le dossier "include" d'AutoIT). Attention, j'ai une version modifiée du fichier <Array.au3> car j'y ai ajouté une fonction.
Le source modifié de "GetRealErrorLine" pour qu'il retourne un résultat au lieu d'une erreur (il y a juste 2 ou 3 petites choses qui changent).

Re: [Ex] Retrouver la ligne d'erreur d'un script compilé

Posté : mar. 19 août 2014 16:57
par TommyDDR
Il va m'être compliqué de vous aider, en analysant votre Array.au3, je vois que vous avez une ancienne version de celui-ci.

Si nous n'avons pas les même versions d'AutoIt, les UDF ont changés entre temps et les lignes ne correspondent plus.

Voici ce que j'obtiens :

Code : Tout sélectionner

---------------------------
Résultat
---------------------------
Fichier :

C:\Program Files (x86)\AutoIt3\Include\ListViewConstants.au3

Ligne :279
---------------------------
OK   
---------------------------
Du coup j'ai essayé de compiler votre programme (ça à marché), de la lancer (ok aussi) mais impossible d'avoir une erreur en l'utilisant.

À savoir aussi, le programme va d'abord chercher l'include dans le dossier include d'AutoIt avant de regarder dans le dossier courant (normalement < > pour le dossier include et " " pour le dossier courant) donc si vous avez un include perso du même nom qu'un include officiel, c'est l'officiel qui sera pris en compte.

Mis à part cela, je ne vois pas où ça peut bloquer..

Avez vous possibilité de supprimer les infos confidentiels et en ajouter d'autres mais bidons ?
(faire en sorte que le programme soit toujours compilable et le bug reproductible une fois recompilé).
Sinon, avez vous essayé de lancer le script dans SciTe avec F5 pour avoir la ligne fautive ?

Juste pour info : Il ne faut jamais modifier un UDF, au pire, faites vous un _ArrayEx.au3 où vous mettrez vos nouvelles fonctions.

Hors sujet : Dans l'aide de votre programme vous avez écris "moins" au lieu de "mois" ^^

Re: [Ex] Retrouver la ligne d'erreur d'un script compilé

Posté : ven. 22 août 2014 10:32
par Jerem
Merci pour la petite coquille dans l'aide, je ne l'avais pas remarqué. :oops:

J'aurai donc une ancienne version d'AutoIT ? Ma version est la 3.3.8.1.

Je ne savais pas qu'il ne fallait pas modifier un UDF, je trouvais plus simple d'y ajouter ma fonction. (re :oops: )

Et oui j'ai tenté de lancer le programme non compilé pour reproduire l'erreur, mais mon programme est fait pour fonctionner dans un environnement bien précis et analyser des logiciels développés par ma société sur des serveurs TSE. Il a fallu que j'installe AutoIT sur le serveur pour ensuite obtenir une erreur dans l'UDF "Array.au3" justement. Mais la ligne incriminée n'est pas une ligne que j'ai ajouté moi-même ce que je trouve très étrange.

Vous l'aurez sans doute compris, il sera impossible pour vous d'exécuter le code de manière à ce qu'il fonctionne comme il le devrait (même si je vous fournissait l'original), et donc encore moins de reproduire l'erreur qu'il génère. Celle-ci se produisant uniquement (et pas à chaque fois non plus) lors d'un clique sur le menu "Actualiser".

Ceci étant, à force de recherche, il semble qu'aujourd'hui j'ai pu résoudre le problème de mon programme.
C'est l'option "OnEvent" qui entraînait un conflit dans l'utilisation des variables communes et provoquait des différence dans les tailles des tableaux entre le début et la fin de l'exécution.

Mais votre programme pourrait s'avérer utile en cas de souci sur un autre des mes scripts.
Je vais donc suivre votre conseil et déplacer ma fonction inclus dans le fichier "Array.au3" dans un autre fichier.
Je vais aussi vérifier ma version d'AutoIT pour être sûr d'avoir la dernière.

Merci à vous.