addr2line permet de retrouver la ligne dans les fichiers sources à partir d'une adresse dans la pile (stack).
-g (option activée par défaut à l'IDRIS)Si l'application ne génère pas de fichiers core ou si vous souhaitez en forcer la création (utile par exemple pour une application MPI qui se bloque), vous pouvez positionner la variable d'environnement BG_COREDUMPONEXIT à 1 pour forcer l'écriture des cores à la fin de l'exécution.
Voici un exemple de programme ayant un dépassement de tableau dans une boucle :
1 program addr2line 2 implicit none 3 4 integer :: i 5 6 integer,dimension(10) :: tab 7 8 do i = 1,1000000 9 tab(i)=2*i-1 10 end do 11 12 print *,'tab(10)=',tab(10) 13 print *,'tab(1000000)=',tab(1000000) 14 end program
Ce programme est compilé avec la commande suivante :
> bgxlf90_r -g test_addr2line.f90 -o test_addr2line
A l'exécution, nous obtenons :
> bgrun -np 1 -exe ./test_addr2line llsubmit: Processed command file through Submit Filter: "/bglocal/loadl/Fidris/llsubmit_exit". The job babel1-adm.idris.fr.35723 has been submitted,please wait... Hit CTRL-C to cancel <Oct 16 09:51:05.408057> BE_MPI (ERROR): The error message in the job record is as follows: <Oct 16 09:51:05.408140> BE_MPI (ERROR): "killed with signal 11" Run terminated
Le contenu du fichier core nous indique la position dans le code lors du plantage (adresses du stack dans la section du même nom :
> cat core.0 +++PARALLEL TOOLS CONSORTIUM LIGHTWEIGHT COREFILE FORMAT version 1.0 +++LCB 1.0 Program: ./test_addr2line Job ID : 16889 Personality: XYZT coordinates : 0,0,0,0 MPI Rank : 0 DDR Size (MB) : 2048 Mode : SMP +++ID TGID 100, Thread 0 ***FAULT Encountered unhandled signal 0x0000000B (11) (SIGSEGV) ... ... ... +++STACK 0x0100136c 0x0000001f ---STACK
La commande addr2line permet de faire la correspondance entre l'adresse sur le stack et la ligne problématique dans le code source :
> /bgsys/drivers/ppcfloor/gnu-linux/bin/powerpc-bgp-linux-addr2line -e ./test_addr2line 0x0100136c /workgpfs/idris/sos/ssos176/babel/formation/addr2line/test_addr2line.f90:9
Notez que le stack contient plusieurs adresses (empilement des appels) et qu'il peut être nécessaire de prendre des adresses plus profondes dans le stack pour trouver l'origine du plantage (surtout si vous appelez des bibliothèques extérieures).