linux – 如何在使用mpirun时使分析器(valgrind,perf,pprof)使用调试符号来获取/使用本地版本的库?

编辑:添加重要说明,它是关于调试MPI应用程序

系统安装的共享库没有调试符号:

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

因此我在我的主目录中编译并安装了我的版本,启用了调试(–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

我已将LD_LIBRARY_PATH和LD_RUN_PATH都设置为首先包含〜/ lib64,而ldd程序确认应使用本地版本的库:

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

所讨论的程序是使用MPI(消息传递接口)的并行数值应用程序.因此,要运行此应用程序,必须使用mpirun包装器(例如mpirun -np 1 valgrind –tool = callgrind ./a.out).我使用OpenMPI实现.

尽管如此,各种分析器:Valgrind,CPU profiling google-perfutilsperf中的callgrind工具都找不到那些调试符号,导致或多或少的无用输出:

> 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

> 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

编辑已添加11-07-2011:
我不知道它是否重要,但是:

$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

$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

解决方法:

如果在callgrind输出中列出了/usr/lib64/libfftw3.so.3.2.4,则LD_LIBRARY_PATH =〜/ lib64无效.

再次尝试使用export LD_LIBRARY_PATH = $HOME / lib64.还要注意您调用的任何shell脚本,这可能会重置您的环境.

上一篇:MPI python-Open-MPI


下一篇:python – 在mpi4py中产生进程的相互通信?