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) :
Et voilà ce que cette unité va afficher :
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
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) :
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).
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 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.
Partager