MPI和Valgrind没有显示行号

MPI and Valgrind not showing line numbers

本文关键字:显示 Valgrind MPI      更新时间:2023-10-16

我写了一个大程序,我很难找到一个分段错误。我发布了一个问题,但我没有足够的信息来继续(见下面的链接-如果你这样做,请注意,我花了几乎一整天的时间尝试了几次,以提出一个最低限度的可编译版本的代码,复制错误,但无济于事)。

https://stackoverflow.com/questions/16025411/phantom-bug-involving-stdvectors-mpi-c

所以现在我第一次尝试valgrind。我只是安装了它(简单地"sudo apt-get install valgrind"),没有特别的安装来解释MPI(如果有的话)。我希望具体的信息,包括文件名和行号(我知道这是不可能为valgrind提供变量名)。当我得到有用的信息时,包括

  • 读取大小为4的文件无效
  • 有条件的跳转或移动取决于未初始化的值
  • 未初始化的值由堆栈分配创建
  • 1块中的4个字节肯定丢失了

除了这个神奇的东西

  • 系统调用参数sched_setffinity (mask)指向0x433CE77的不可寻址字节:sycall (sycall . s:31)地址0x0没有堆栈,malloc或(最近)释放

我没有得到文件名和行号。而是得到

==15095==    by 0x406909A: ??? (in /usr/lib/openmpi/lib/libopen-rte.so.0.0.0)
下面是我如何编译我的代码:
mpic++ -Wall -Wextra -g -O0 -o Hybrid.out (…file names)
下面是我执行valgrind的两种方式:
valgrind --tool=memcheck --leak-check=full --track-origins=yes --log-file=log.txt mpirun -np 1 Hybrid.out

mpirun -np 1 valgrind --tool=memcheck --leak-check=full --track-origins=yes --log-file=log4.txt -v ./Hybrid.out

基于

中的指令的第二个版本

使用Open MPI运行并行程序时出现分段错误

,如果我理解正确的话,它似乎与

openmpi with valgrind(我可以在Ubuntu发行版中使用MPI编译吗?)

我故意在一个处理器上运行valgrind,因为这是我的程序在没有分段错误的情况下执行完成的唯一方法。我也用两个处理器运行了它,我的程序段如预期的那样出现了故障,但是我从valgrind返回的日志似乎包含了本质上相同的信息。我希望通过解决valgrind在一个处理器上报告的问题,我将神奇地解决发生在多个处理器上的问题。

我尝试在程序编译中包含"-static",正如

中建议的那样

Valgrind不显示行号,尽管-g标志(在Ubuntu 11.10/VirtualBox)

,但编译失败,显示(除了几个警告)

dynamic STT_GNU_IFUNC symbol "strcmp" with pointer equality in '…' can not be used when making an executably; recompile with fPIE and relink with -pie

我还没有研究"fPIE"answers"-pie"是什么意思。另外,请注意,我没有使用makefile,我目前也不知道如何编写一个。

还有一些注意事项:我的代码没有使用malloc、calloc或new命令。我完全使用std::vector;没有C数组。我确实使用。resize()、。insert()、。erase()和。pop_back()等命令。我的代码还通过引用和常量引用将向量传递给函数。对于并行命令,我只使用MPI_Barrier()、MPI_Bcast()和MPI_Allgatherv()。

如何让valgrind显示它报告的错误的文件名和行号?谢谢大家的帮助!

编辑

我继续工作,我的一个朋友指出,没有行号的报告都来自MPI文件,我没有从源代码编译,因为我没有编译它们,我不能使用-g选项,因此,看不到行。因此,我基于以下命令再次尝试了valgrind,

mpirun -np 1 valgrind --tool=memcheck --leak-check=full --track-origins=yes --log-file=log4.txt -v ./Hybrid.out

但是现在对于两个处理器,它是

mpirun -np 2 valgrind --tool=memcheck --leak-check=full --track-origins=yes --log-file=log4.txt -v ./Hybrid.out

程序运行到完成(我没有看到命令行中报告的seg错误),但是valgrind的执行确实给了我文件中的行号。valgrind所指向的行是我调用MPI_Bcast()的行。是否可以肯定地说,出现这种情况是因为内存问题只在多个处理器上表现出来(因为我已经在np -1上成功运行了它)?

听起来你用错了工具。如果您想知道在哪里出现了分段错误,请使用gdb。

这里有一个简单的例子。该程序将在*b=5

处发生分段故障。
// main.c
int
main(int argc, char** argv)
{
   int* b = 0;
   *b = 5;
   return *b;
}

查看使用gdb;(<----部分解释输入行)

svengali ~ % g++ -g -c main.c -o main.o # include debugging symbols in .o file
svengali ~ % g++ main.o -o a.out        # executable is linked (no -g here)
svengali ~ % gdb a.out
GNU gdb (GDB) 7.4.1-debian
<SNIP>
Reading symbols from ~/a.out...done.
(gdb) run <--------------------------------------- RUNS THE PROGRAM
Starting program: ~/a.out 
Program received signal SIGSEGV, Segmentation fault.
0x00000000004005a3 in main (argc=1, argv=0x7fffffffe2d8) at main.c:5
5      *b = 5;
(gdb) bt  <--------------------------------------- PRINTS A BACKTRACE
#0  0x00000000004005a3 in main (argc=1, argv=0x7fffffffe2d8) at main.c:5
(gdb) print b <----------------------------------- EXAMINE THE CONTENTS OF 'b'
$2 = (int *) 0x0
(gdb)