MPI和Valgrind没有显示行号
MPI and Valgrind not showing line numbers
我写了一个大程序,我很难找到一个分段错误。我发布了一个问题,但我没有足够的信息来继续(见下面的链接-如果你这样做,请注意,我花了几乎一整天的时间尝试了几次,以提出一个最低限度的可编译版本的代码,复制错误,但无济于事)。
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)
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- valgrind-hellgrind与泄漏检查的结果不同
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 字符串-C++后显示的随机字符
- 继承期间显示未知行为的子类
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- 了解 Linux 虚拟内存:valgrind 的 massif 输出显示了有和没有 --pages-as-heap 的主要差异
- Valgrind 在 std::make_unique 中显示内存泄漏
- Valgrind 显示无效的读/写错误,但我不使用 new 或 calloc,只使用向量和固定数组
- Valgrind 在主机名命令输出中显示内存泄漏
- Valgrind 未显示使用不正确的 c_str() 的无效内存访问
- valgrind在std::map中显示无效读取错误
- Valgrind 的调试结果没有向我显示发生错误的行数
- C ++ Valgrind 在 Hello World 中显示内存泄漏
- 为什么valgrind显示泄漏,即使包含动态分配对象的向量被释放
- MPI和Valgrind没有显示行号
- 即使修复了漏洞,Valgrind仍然显示相同的内存泄漏
- Valgrind显示的数据在构造函数c++中肯定丢失了
- Valgrind 在 unittest-cpp 库中显示内存泄漏
- Valgrind的输出显示间接丢失的内存泄漏,但没有明确丢失或可能丢失