Turing : addr2line

Description

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

Utilisation

  • Usage : addr2line -e nom_executable adresse_stack
  • Compiler avec l'option -g

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ébordement de tableau :

  1  program addr2line
  2    implicit none
  3
  4    integer               :: i
  5    integer, parameter    :: n=5000, maxidx=10000
  6    integer, dimension(n) :: tab
  7
  8    tab(:) = [ (2*i-1, i=1,n) ]
  9
 10    print *, 'tab(maxidx)=', tab(maxidx)
 11  end program
 

Ce programme est compilé avec la commande suivante :

$ bgxlf90_r -g test_addr2line.f90 -o test_addr2line

Il faut ensuite exécuter le programme via une soumission batch :

soumis.ll
# @ job_name = job_simple
# @ job_type = BLUEGENE
# @ output = $(job_name).$(jobid)
# @ error = $(output)
# @ wall_clock_limit = 00:10:00
# @ bg_size = 64
# @ queue
set -x
cd $workdir
runjob --ranks-per-node 16  --np 1 : ./test_addr2line
$ llsubmit soumis.ll

Un fichier core est alors généré (core.0) qui 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    : 15869
Personality:
   ABCDET coordinates : 0,0,0,0,0,0
   Rank               : 0
   Ranks per node     : 16
   DDR Size (MB)      : 16384
+++ID Rank: 0, TGID: 1, Core: 0, HWTID:0 TID: 1 State: RUN
***FAULT Encountered unhandled signal 0x0000000b (11) (SIGSEGV)
  ...
  ...
  ...
+++STACK
Frame Address     Saved Link Reg
0000001fbfff6b40  0000000001012ce4
0000001fbfff6be0  0000000001000468
0000001fbfffbaa0  000000000105d328
0000001fbfffbd80  000000000105d624
0000001fbfffbe40  0000000000000000
---STACK
Interrupt Summary:
  System Calls 27
  External Input Interrupts 1
  Data TLB Interrupts 1
---ID
---LCB

La commande addr2line permet de faire la correspondance entre l'adresse sur le stack et la ligne problématique dans le code source. Pour cela, il faut faire une petite transformation pour donner la bonne information à addr2line : il suffit de remplacer les 8 premiers 0 des entrées de la colonne Saved Link Reg par 0x. Cela donne pour notre exemple et pour la deuxième entrée :

$ powerpc64-bgq-linux-addr2line -e ./test_addr2line 0x01000468
~rlab001/turing/formation_bg/trunk/demos/addr2line/test_addr2line.f90:10

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).