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

Codes sources à télécharger Delphi Discussion :

Support de la pile d'appels sur exception basé sur jclDebug


Sujet :

Codes sources à télécharger Delphi

Mode arborescent

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 907
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 907
    Par défaut Support de la pile d'appels sur exception basé sur jclDebug
    Bonjour à tous !

    Certains préfèrent MadExcept ou EurekaLog, d'autres se contentent de jclDebug fournie dans la Jedi Code Library (JCL disponible via GetIt). Je fais partie du deuxième groupe

    Je vous propose une petite unité permettant de facilement extraire la pile d'appels, de la purger de toutes les informations inutiles, puis de l'afficher ou de la sauvegarder dans un fichier.

    Voici un exemple de pile retournée par jclDebug en débogage 64 bits (le plus illisible des cas) :
    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
    37
    38
    39
    40
    41
    42
    43
    44
    [000000000040B954]{Project1.exe} System._ZN6System11_MulDivCompExxx
    [000000000070A01C]{Project1.exe} JclDebug._ZN8Jcldebug17TJclStackInfoListC3EbiPvbS1_
    [000000000070C769]{Project1.exe} JclDebug._ZN8Jcldebug21GetExceptionStackInfoEPN6System16TExceptionRecordE
    [0000000000441DD7]{Project1.exe} System.SysUtils._ZN6System8Sysutils9Exception16RaisingExceptionEPNS_16TExceptionRecordE
    [0000000000442ADB]{Project1.exe} System.SysUtils._ZN6System8Sysutils18GetExceptionObjectEPNS_16TExceptionRecordE
    [00000000006FC889]{Project1.exe} JclHookExcept._ZN13Jclhookexcept14DoExceptFilterEPN6System16TExceptionRecordE
    [00000000006FCB5D]{Project1.exe} JclHookExcept._ZN13Jclhookexcept19HookedExceptObjProcEPN6System16TExceptionRecordE
    [000000000040E6C7]{Project1.exe} System._ZN6System23_DelphiExceptionHandlerEPNS_16TExceptionRecordEyPvS2_
    [00007FFA866D20CF]{ntdll.dll   } Unknown function at __chkstk
    [00007FFA86681454]{ntdll.dll   } RtlRaiseException
    [00007FFA866D0BFE]{ntdll.dll   } KiUserExceptionDispatcher
    [000000000040B954]{Project1.exe} System._ZN6System11_MulDivCompExxx
    [000000000070DD00]{Project1.exe} Unit1._ZN5Unit111TestIncProcEv (Line 4, "Test.inc")
    [000000000070DDBE]{Project1.exe} Unit1._ZN5Unit16TForm14ProcEv (Line 53, "Unit1.pas")
    [000000000070DEA6]{Project1.exe} Unit1._ZN5Unit16TForm116bNestedCallClickEPN6System7TObjectE (Line 71, "Unit1.pas")
    [00000000005B37F3]{Project1.exe} Vcl.Controls._ZN3Vcl8Controls8TControl5ClickEv
    [00000000005D871B]{Project1.exe} Vcl.StdCtrls._ZN3Vcl8Stdctrls13TCustomButton5ClickEv
    [00000000005D9FA4]{Project1.exe} Vcl.StdCtrls._ZN3Vcl8Stdctrls13TCustomButton9CNCommandERN6Winapi8Messages10TWMCommandE
    [000000000040D225]{Project1.exe} System._ZN6System7TObject8DispatchEPv
    [00000000005B30F0]{Project1.exe} Vcl.Controls._ZN3Vcl8Controls8TControl7WndProcERN6Winapi8Messages8TMessageE
    [00000000005BA530]{Project1.exe} Vcl.Controls._ZN3Vcl8Controls11TWinControl7WndProcERN6Winapi8Messages8TMessageE
    [00000000005D8135]{Project1.exe} Vcl.StdCtrls._ZN3Vcl8Stdctrls14TButtonControl7WndProcERN6Winapi8Messages8TMessageE
    [00000000005B2BE2]{Project1.exe} Vcl.Controls._ZN3Vcl8Controls8TControl7PerformEjyx
    [00000000005BA70E]{Project1.exe} Vcl.Controls._ZN3Vcl8Controls12DoControlMsgEP6HWND__Pv
    [00000000005BB8C8]{Project1.exe} Vcl.Controls._ZN3Vcl8Controls11TWinControl9WMCommandERN6Winapi8Messages10TWMCommandE
    [0000000000687508]{Project1.exe} Vcl.Forms._ZN3Vcl5Forms11TCustomForm9WMCommandERN6Winapi8Messages10TWMCommandE
    [000000000040D225]{Project1.exe} System._ZN6System7TObject8DispatchEPv
    [00000000005B30F0]{Project1.exe} Vcl.Controls._ZN3Vcl8Controls8TControl7WndProcERN6Winapi8Messages8TMessageE
    [00000000005BA530]{Project1.exe} Vcl.Controls._ZN3Vcl8Controls11TWinControl7WndProcERN6Winapi8Messages8TMessageE
    [00000000006823E1]{Project1.exe} Vcl.Forms._ZN3Vcl5Forms11TCustomForm7WndProcERN6Winapi8Messages8TMessageE
    [00000000005B96CC]{Project1.exe} Vcl.Controls._ZN3Vcl8Controls11TWinControl11MainWndProcERN6Winapi8Messages8TMessageE
    [000000000051EA06]{Project1.exe} System.Classes._ZN6System7Classes10StdWndProcEP6HWND__jyy
    [00007FFA8644E7E8]{USER32.dll  } Unknown function at CallWindowProcW
    [00007FFA8644DDAB]{USER32.dll  } Unknown function at SendMessageW
    [00007FFA8644D61A]{USER32.dll  } SendMessageW
    [00007FFA7C722467]{COMCTL32.dll} Unknown function at ImageList_LoadImageW
    [00007FFA7C7320F0]{COMCTL32.dll} Unknown function at ImageList_WriteEx
    [00007FFA8644E7E8]{USER32.dll  } Unknown function at CallWindowProcW
    [00007FFA8644E47E]{USER32.dll  } CallWindowProcW
    [00000000005BA6A1]{Project1.exe} Vcl.Controls._ZN3Vcl8Controls11TWinControl14DefaultHandlerEPv
    [00000000005B3E9F]{Project1.exe} Vcl.Controls._ZN3Vcl8Controls8TControl11WMLButtonUpERN6Winapi8Messages8TWMMouseE
    [000000000040D225]{Project1.exe} System._ZN6System7TObject8DispatchEPv
    [00000000005B30F0]{Project1.exe} Vcl.Controls._ZN3Vcl8Controls8TControl7WndProcERN6Winapi8Messages8TMessageE
    [00000000005BA530]{Project1.exe} Vcl.Control
    Et voilà ce que cette unité va afficher :

    Nom : 2021-10-09 17_05_36-Erreur.jpg
Affichages : 306
Taille : 33,5 Ko

    Sympa non


    Tout cela se présente sous la forme d'un assistant de classe de Exception très simple à utiliser.

    Mise en œuvre :

    • En RELEASE il faut avant tout activer les "Informations de débogage", au minimum Informations de débogage limitées et générer un fichier map Détaillé.
    • A noter également que si l'option "Utiliser les DCU de débogage" est activée, la liste d'erreurs affichée est beaucoup plus conséquente. Désactivez-la pour limiter la liste à vos seules sources.


    Ajoutez cette unité Helper.Exception à vos clauses uses. Ensuite dans vos gestionnaires d'exception (ApplicationEvents.OnException ou try..except) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      try
        ...
      except
        on E:Exception do
        begin
          E.Show;
          E.SaveToFile('error.log');
        end;
      end;
    La méthode Show accepte deux paramètres : aStackTrace qui détermine si la pile est affichée (elle ne l'est pas par défaut en RELEASE) et aExpanded pour qu'elle soit visible immédiatement (sinon l'appui sur un bouton est requis).

    La méthode SaveToFile accepte deux paramètres en plus du nom du fichier : aTitle qui permet l'ajout d'une information supplémentaire (par exemple ClassName dans un thread de travail, un nom d'utilisateur ou numéro de session en RDP) et aMutex pour un accès synchronisé au fichier log.

    En mode débogage, la boîte de dialogue affiche également un lien "Trouver de l'aide en ligne" pour vous faciliter la recherche relative à l'erreur ; un message SGBD laconique par exemple


    Voilà, une petite contribution qui ne mange pas de pain mais qui j'espère en ravira certains

    Bien à vous !

    [EDIT]
    Quelques petites améliorations dans cette nouvelle version :

    • meilleur parsing des procédures anonymes en debug64 ;
    • jclDebug et JclHookexcept son ignorées ;
    • quelques petites améliorations dans les expressions régulières ;
    • alignement à la sauvegarde si l'erreur est multilignes ;
    • ● n'est ajouté qu'à l'affichage.
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. pile d'appel et exception
    Par lotfi33 dans le forum Débuter
    Réponses: 2
    Dernier message: 30/06/2010, 13h51
  2. question sur la pile d'appel de fonctions
    Par deubelte dans le forum Visual C++
    Réponses: 1
    Dernier message: 03/03/2010, 15h46
  3. Connaître la pile d'appels lors d'une exception
    Par MiJack dans le forum Langage
    Réponses: 9
    Dernier message: 19/11/2009, 10h59
  4. Affichage de la pile d'appel lors d'une exception
    Par damien.yep dans le forum Langage
    Réponses: 1
    Dernier message: 14/09/2005, 16h42
  5. [Exception]Connaitre la pile d'appel de classes/méthodes
    Par salome dans le forum Général Java
    Réponses: 2
    Dernier message: 19/03/2005, 20h21

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