Re: Trace GNAT FSF avec numéro de lignes ...
Stephane Carrez via Ada-france <[email protected]> Wed, 29 Jun 2022 00:09:28 +0200
| Newsgroups | gmane.comp.lang.ada.france |
|---|---|
| Message-ID | <[email protected]> |
Bonjour Stef, GCC a déjà le paquetage suivant package System.Dwarf_Lines qui fait la lecture des infos Dwarf de debug (voir gcc/ada/libgnat/s-dwalin.adb). Présent dans gcc 9.4 et suivants. A priori, ca ne dépend pas de la lib GNU BFD qui est sous GPL. L'implémentation me parait 100% Ada :-) Si je compile GCC 12.1 (sources GNU, pas Debian), alors le support des traces symboliques est correct. Il me semble que c'est bon aussi avec gcc sous Ubuntu 20. J'ai souvenir qu'autrefois il y avait un patch soit dans Debian soit dans FreeBSD pour lancer 'addr2line' et obtenir les traces symboliques. Le problème est que c'est catastrophiquement lent du fait qu'on doit lancer `addr2line` pour chaque frame/line. L'implémentation basée sur System.Traceback.Symbolic et System.Dwarf_Lines est assez efficace. A+ Stephane C. On 28/06/2022 16:34, Stéphane Rivière via Ada-france wrote: > Bonjour à toutes et tous, > > Dans nos devs, on a une fonction une trace post-mortem, avec affichage et écriture sur disque. > > Dans les version Pro et CE, AdaCore a intégré l'utilitaire GNU/GCC addr2line dans le runtime GNAT. Il est appelé pour afficher les noms de sous-programmes et numéros de ligne de la pile d'appel. > > Cette fonctionnalité est absente de la version FSF. C'est une plainte récurrente sur le net, certains proposent des contournements, mais aucun ne fonctionnent ici (Linux, GNAT FSF 11). > > Les versions CE étant enterrées, il y avait deux solutions pour rétablir cette fonctionnalité bien utile ; la propre (faire pareil qu'AdaCore, possible mais manque de temps) et la sale (plus rapide). Donc en résumé... > > *CE21 (ou Pro)* > > Exception time : 20220627 175714 > Program uptime : 0h00m00s > Program build DT stamp : build 2022-06-27 17:57:11 > Program name & version : gnx v3.2 > Library name & version : v20 v0.11 > Start directory : /home/sr/Seafile/Sowebio/informatique/github/genesix/gnx/bin > Home directory : /home/sr > Ada mem. alloc. (bytes): Ada Cur: [ 22828 ] Max: [ 40356 ] > All mem. alloc. (bytes): All Cur: [ 4788224 ] Max: [ 4788224 ] > > raised CONSTRAINT_ERROR : bad input for 'Value: "sr" > [./gnx] > 0x732ae2 system__val_util__bad_value at ??? > 0x731c2c system__val_int__impl__scan_integer at ??? > 0x731cb5 system__val_int__impl__value_integer at ??? > *0x577e6a V20.Vst.To_Integer at v20-vst.adb:84* > *0x41b05a Gnx at gnx.adb:1174** > **0x53521d Main at b__gnx.adb:455* > 0x74ca98 __libc_start_call_main at ??? > 0x74e2f5 __libc_start_main at ??? > 0x406d43 _start at ??? > > *GNAT 11.2 (avant) > * > > Exception time : 20220627 170132 > Program uptime : 0h00m00s > Program build DT stamp : build 2022-06-27 18:00:48 > Program name & version : gnx v3.2 > Library name & version : v20 v0.11 > Start directory : /home/sr/Seafile/Sowebio/informatique/github/genesix/gnx/bin > Home directory : /home/sr > Ada mem. alloc. (bytes): Ada Cur: [ 22828 ] Max: [ 40356 ] > All mem. alloc. (bytes): All Cur: [ 4861952 ] Max: [ 4861952 ] > > raised CONSTRAINT_ERROR : bad input for 'Value: "sr" > [./gnx] > 0x70c399 system__val_util__bad_value at ??? > 0x70b7ad system__val_int__impl__scan_integer at ??? > 0x70b7ee system__val_int__impl__value_integer at ??? > *0x574bca v20__vst__to_integer__2 at ???** > **0x41c801 _ada_gnx at ???** > **0x5311f5 main at ???* > 0x721f48 __libc_start_call_main at ??? > 0x7237a5 __libc_start_main at ??? > 0x406db3 _start at ??? > > *GNAT 11.2 (après)* > > Exception time : 20220628 121655 > Program uptime : 0h00m00s > Program build DT stamp : build 2022-06-28 12:16:49 > Program name & version : gnx v3.2 > Library name & version : v20 v0.11 > Start directory : /home/sr/Seafile/Sowebio/informatique/github/genesix/gnx/bin > Home directory : /home/sr > Ada mem. alloc. (bytes): Ada Cur: [ 24204 ] Max: [ 40356 ] > All mem. alloc. (bytes): All Cur: [ 5189632 ] Max: [ 5189632 ] > > raised CONSTRAINT_ERROR : bad input for 'Value: "sr" > [./gnx] > 0x71e4d9 system__val_util__bad_value at ??? > 0x71d8ed system__val_int__impl__scan_integer at ??? > 0x71d92e system__val_int__impl__value_integer at ??? > *0x5784ac v20__vst__to_integer__2 at v20-vst.adb:84 (discriminator 1)** > **0x41c801 _ada_gnx at gnx-utl_sv.adb:1174** > **0x5311f5 main at b__gnx.adb:448* > 0x734088 __libc_start_call_main at ??? > 0x7358e5 __libc_start_main at ??? > 0x406db3 _start at ??? > > Au traitement d'une exception létale, la fonction de v20 (notre lib généraliste) en charge de la trace regarde si l'utilitaire addr2line existe sur le système puis, pour chaque ligne indiquant un "???" lance, sur son propre exécutable, un addr2line -e <nom de l'exécutable> <adresse> et analyse le retour. Si ce dernier contient une réponse valide (exemple : /home/sr/.../debug/gnx-utl_sv.adb:1174, par opposition à "addr2line: DWARF error: can't find .debug_ranges section." et/ou "??:?", ??:0"), la fonction remplace "???" par "gnx-utl_sv.adb:1174". Si le programme a été compilé par une version Pro ou CE, c'est transparent et si add2line n'a pas été trouvé, les "???" sont laissés tels quels. > > C'était le seul obstacle pour abandonner CE 21 (GNAT 10 & GnatStudio 22) pour le GNAT 11 FSF de Alire et le GnatStudio 23 de la rolling release AdaCore, ce nouvel environnement est plus à jour et encore mieux fini. GnatStudio 23 est plein de bonnes petites surprises et l'amélioration de la fiabilité et de la finition sont notables sur les dernières versions. > > Pas encore poussé ce patch (de 10 lignes) dans le github Sowebio mais ça va venir. Dans un second temps, addr2line pourrait être embarqué dans le binaire grâce à l'utilitaire de Stéphane Carrez et auto-décompressé à la volée si nécessaire. Dans un troisième temps, on pourrait tenter de faire comme AdaCore. addr2line est "juste" (sic) un analyseur d'info de debug DWARF. Il pourrait même être recodé en Ada... > > Stef > > > -- > Stéphane Rivière > Ile d'Oléron - France > > > _______________________________________________ > Ada-france mailing list > [email protected] > https://mail.ada-france.org/cgi-bin/mailman/listinfo/ada-france _______________________________________________ Ada-france mailing list [email protected] https://mail.ada-france.org/cgi-bin/mailman/listinfo/ada-france