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

  1. #1
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 691
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 691
    Points : 13 121
    Points
    13 121
    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 : 274
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

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 455
    Points : 24 867
    Points
    24 867
    Par défaut
    Le map détaillé, n'as-tu pas été obligé de le convertir via MakeJclDbg ?

    Code CMD : Sélectionner tout - Visualiser dans une fenêtre à part
    MakeJclDbg -j -e MonProjet.map

    Unité, sympa, question style, je pratique aussi le "class constructor" au lieu de initialization mais couplé à un "class helper" c'est tout intégré, c'est pas mal du tout !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 691
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 691
    Points : 13 121
    Points
    13 121
    Par défaut
    Non ça fonctionne très bien avec un map.

    Mais un jdbg est beaucoup plus compact et peut être directement intégré dans l'exe. Et pas besoin d'un outil externe, tout est intégré dans l'IDE sous Projet/JCL Debug Expert. On ne s'occupe de rien, tout se fait à la construction

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