linux – ¿Cómo hacer que los perfiladores (valgrind, perf, pprof) recojan / utilicen la versión local de la biblioteca con símbolos de depuración al usar mpirun?

Edición: nota importante agregada de que se trata de depurar la aplicación MPI

La biblioteca compartida instalada del sistema no tiene símbolos de depuración:

$ readelf -S /usr/lib64/libfftw3.so | grep debug
$

Por lo tanto, he compilado e instalado en mi directorio personal mi propia versión, con la depuración habilitada (–with-debug CFLAGS = -g):

$ $ readelf -S ~/lib64/libfftw3.so | grep debug
  [26] .debug_aranges    PROGBITS         0000000000000000  001d3902
  [27] .debug_pubnames   PROGBITS         0000000000000000  001d8552
  [28] .debug_info       PROGBITS         0000000000000000  001ddebd
  [29] .debug_abbrev     PROGBITS         0000000000000000  003e221c
  [30] .debug_line       PROGBITS         0000000000000000  00414306
  [31] .debug_str        PROGBITS         0000000000000000  0044aa23
  [32] .debug_loc        PROGBITS         0000000000000000  004514de
  [33] .debug_ranges     PROGBITS         0000000000000000  0046bc82

He configurado LD_LIBRARY_PATH y LD_RUN_PATH para incluir ~ / lib64 primero, y el programa ldd confirma que se debe usar la versión local de la biblioteca:

$ ldd a.out | grep fftw
        libfftw3.so.3 => /home/narebski/lib64/libfftw3.so.3 (0x00007f2ed9a98000)

El programa en cuestión es una aplicación numérica paralela que utiliza MPI (interfaz de paso de mensajes). Por lo tanto, para ejecutar esta aplicación, debe usar el envoltorio mpirun (por ejemplo, mpirun -np 1 valgrind –tool = callgrind ./a.out). Yo uso la implementación de OpenMPI.

Sin embargo, varios perfiladores: la herramienta callgrind en Valgrind, CPU profiling google-perfutils y perf no encuentran esos símbolos de depuración, lo que resulta en una salida más o menos inútil:

> calgrind

$ callgrind_annotate --include=~/prog/src --inclusive=no  --tree=none
[...]
--------------------------------------------------------------------------------
            Ir  file:function
--------------------------------------------------------------------------------
32,765,904,336  ???:0x000000000014e500 [/usr/lib64/libfftw3.so.3.2.4]
31,342,886,912  /home/narebski/prog/src/nonlinearity.F90:__nonlinearity_MOD_calc_nonlinearity_kxky [/home/narebski/prog/bin/a.out]
30,288,261,120  /home/narebski/gene11/src/axpy.F90:__axpy_MOD_axpy_ij [/home/narebski/prog/bin/a.out]
23,429,390,736  ???:0x00000000000fc5e0 [/usr/lib64/libfftw3.so.3.2.4]
17,851,018,186  ???:0x00000000000fdb80 [/usr/lib64/libmpi.so.1.0.1]

> google-perftools:

$ pprof --text a.out prog.prof
Total: 8401 samples
     842  10.0%  10.0%      842  10.0% 00007f200522d5f0
     619   7.4%  17.4%     5025  59.8% calc_nonlinearity_kxky
     517   6.2%  23.5%      517   6.2% axpy_ij
     427   5.1%  28.6%     3156  37.6% nl_to_direct_xy
     307   3.7%  32.3%     1234  14.7% nl_to_fourier_xy_1d

> eventos perf:

$ perf report --sort comm,dso,symbol
# Events: 80K cycles
#
# Overhead  Command         Shared Object                                        Symbol
# ........  .......  ....................  ............................................
#
    32.42%  a.out     libfftw3.so.3.2.4     [.]            fdc4c
    16.25%  a.out             7fddcd97bb22  [.]     7fddcd97bb22
     7.51%  a.out     libatlas.so.0.0.0     [.] ATL_dcopy_xp1yp1aXbX
     6.98%  a.out     a.out                 [.] __nonlinearity_MOD_calc_nonlinearity_kxky
     5.82%  a.out     a.out                 [.] __axpy_MOD_axpy_ij

Edición añadida 11-07-2011:
No sé si es importante, pero:

$ file /usr/lib64/libfftw3.so.3.2.4
/usr/lib64/libfftw3.so.3.2.4: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, stripped

y

$ file ~/lib64/libfftw3.so.3.2.4
/home/narebski/lib64/libfftw3.so.3.2.4: ELF 64-bit LSB shared object, x86-64, version 1 (GNU/Linux), dynamically linked, not stripped
Mejor respuesta
Si /usr/lib64/libfftw3.so.3.2.4 aparece en la salida de callgrind, entonces su LD_LIBRARY_PATH = ~ / lib64 no tuvo ningún efecto.

Vuelva a intentarlo con la exportación LD_LIBRARY_PATH = $ HOME / lib64. También tenga cuidado con los scripts de shell que invoque, lo que podría restablecer su entorno.

Por favor indique la dirección original:linux – ¿Cómo hacer que los perfiladores (valgrind, perf, pprof) recojan / utilicen la versión local de la biblioteca con símbolos de depuración al usar mpirun? - Código de registro