Babel : addr2line

Description

addr2line permet de retrouver la ligne dans les fichiers sources à partir d'une adresse dans la pile (stack).

Utilisation

  • Chemin : /bgsys/drivers/ppcfloor/gnu-linux/bin/powerpc-bgp-linux-addr2line
  • Usage : addr2line -e nom_executable adresse_stack
  • Compiler avec l'option -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.

Exemple

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
~rlab001/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).