IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

Bug incompris non récurrent


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 117
    Par défaut Bug incompris non récurrent
    Bonjour,

    je programme une application et je me retrouve face a un sérieux problème.
    De temps en temps (c'est à dire pas a chaque lancement du programme) un bug se produit et je n'y comprend rien je vous donne toutes les infos que j'ai:

    dans l'event log:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    First chance exception at $7C812A5B. Exception class EAccessViolation with message 'Access violation at address 00401A4F in module 'TrialManager.exe'. Write of address 00000004'. Process TrialManager.exe (1024)
    dans le Call stack:thread 1564:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    :7c812a5b kernel32.RaiseException + 0x52
    :00404b7c NotifyNonDelphiException + $1C
    :7c91378b ntdll.RtlConvertUlongToLargeInteger + 0x46
    dans la CPU:ligne pointée:
    Je ne sais pas si le reste est utile.

    Si vous pouvez m'aider a comprendre Merci.

  2. #2
    Membre éclairé

    Profil pro
    Chef de Projet / Développeur
    Inscrit en
    Juin 2002
    Messages
    619
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de Projet / Développeur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2002
    Messages : 619
    Par défaut
    Bonjour,

    Visiblement il y a un cast (implicite ?) d'un entier 64 bit non signé en 64bits signé.

    Si la valeur est petite, le cast se fait sans perte de donnée (et ça passe).
    Si la valeur est grande, le nombre de valeur positive étant moitié moindre dans un entier signé, tu as une exception, car il y a perte de donnée significative.

    Puisque cela semble aléatoire, j'aurais pensé à un entier fourni par le système, comme un handle de fenêtre - mais ce n'est pas cela puisqu'un handle n'est que sur 32 bits.

    Tu n'arrive pas à avoir la pile d'appel, plus longue que cela ?

  3. #3
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 931
    Billets dans le blog
    6
    Par défaut
    vanquish a probablement raison.

    mais ce qui est étonnant est d'obtenir un EAccessViolation au lieu d'un EConvertError...

    sinon, le pop esi de la fenêtre CPU est dans la routine qui traite l'exception => ne renseigne pas sur le pb

    il serait sympa de savoir qui appelait la fonction de conversion
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  4. #4
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 117
    Par défaut
    Citation Envoyé par vanquish Voir le message

    Tu n'arrive pas à avoir la pile d'appel, plus longue que cela ?
    J'envoi une image de mon écran ça sera plus simple je pense.



    Merci

  5. #5
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 117
    Par défaut
    Alors j'ai modifié un détail dans mon code et il semble que ce bug a disparu (bien que ce soit difficile d'être certain car je ne connaissais pas vraiment la procedure qui le faisait apparaître).

    D'où une autre question:

    Je vais prendre un exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    unit MAIN;
     
    interface
     
    uses Windows, SysUtils, Classes, Graphics, Forms, Controls, UTest;
     
    type
      TMainForm = class(TForm)
     
      private
        { Private declarations }
        procedure CreateMDIChild;
      public
        { Public declarations }
      end;
     
    var
      MainForm: TMainForm;
      Test: TTest;
     
    implementation
     
    {$R *.dfm}
     
    procedure TMainForm.CreateMDIChild;//relièe à MainFormOnCreate
    begin
     
       Test:=TTest.Create(Application.MainForm);
     
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    unit UTest;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Menus;
     
    type
      TTest = class(TForm)
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
     
     
    implementation
     
    {$R *.dfm}
     
    uses Main;
     
    procedure TTest.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    Action:=caFree;
     
    //Comment supprimer Test dans Main?
    Main.Test:=nil;
    Test:=nil;
    //Et pourquoi l'un plutôt que l'autre?
     
    end;
     
    end.
    Voilà la question est en commentaire dans l'unit UTest.
    En gros dans mon application j'utilisais Main.Test:=nil; et en utilisant Test:=nil; le bug semble avoir disparu.
    Est-ce un hazard ou ai-je mal compris quelque chose?

    Merci

  6. #6
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 117
    Par défaut
    Rectification le bug est toujours là!!!


  7. #7
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 931
    Billets dans le blog
    6
    Par défaut
    je me demande si tu ne déclares pas MainForm comme Owner de Test dans son Create => je ne suis pas sûr qu'il faille nihiler Main.Test !

    disons que si tu te charges de libérer Test, lui faut-il un owner ? faire un Create(nil) éviterait pê des soucis (sauf si MainForm.Free doit libérer Test s'il n'a pas été libéré avant...)
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  8. #8
    rsc
    rsc est déconnecté
    Membre émérite
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Par défaut
    Citation Envoyé par cbegood Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    procedure TTest.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    Action:=caFree;
     
    //Comment supprimer Test dans Main?
    Main.Test:=nil;
    Test:=nil;
    //Et pourquoi l'un plutôt que l'autre?
     
    end;
     
    end.
    A mon sens, ce code pose problème :
    Tu n'as pas besoin de détruire ton objet, puisque tu passes à son OnClose un paramètre caFree. Mais tu annules ta référence à l'objet dans une procédure de l'objet lui-même, ce qui est proprement acrobatique. Du coup, l'appel au destructeur va se faire sur une référence devenue invalide. Je suppose que selon que les données à cette adresse ont été écrasées ou non, ça plantera ou non, ce qui peut donner cet aspect aléatoire au bug.

  9. #9
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 117
    Par défaut
    Je comprend plus ou moins ta remarque Roland, mais le bug ne se produit pas a la fermeture de la fenêtre donc cette procédure n'est pas en cause je pense?
    Je vais tout de même regarder pour changer cela merci.

Discussions similaires

  1. Est ce que ceci est un bug ou non
    Par saha84 dans le forum Scilab
    Réponses: 0
    Dernier message: 26/03/2015, 13h40
  2. Bug affichage non constant
    Par pedros dans le forum Firefox
    Réponses: 1
    Dernier message: 07/06/2014, 16h47
  3. Erreur ORA-12545 non récurrente
    Par ben_harper dans le forum Oracle
    Réponses: 4
    Dernier message: 19/05/2009, 12h00
  4. [AJAX] bug méthode non gérée sous IE (pas sous FF)
    Par tomo0013 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 03/11/2008, 16h14
  5. [DW MX] DW MX = Bug ou non ?
    Par remybelleau dans le forum Dreamweaver
    Réponses: 4
    Dernier message: 13/09/2007, 18h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo