free()崩溃,但只有分配了超过一定大小的内存时才会崩溃

时间:2012-05-15 14:30:02

标签: c malloc free mpi

我有一个奇怪的问题,在我的mpi程序中释放已分配的内存:

以下是为我生成错误的代码示例:

void *out, *in;
int cnt = 2501; //if cnt<=2500: works perfectly. cnt>2500: crashes at free!

if((out = malloc(cnt * sizeof(double))) == NULL) 
    MPI_Abort(MPI_COMM_WORLD, MPI_ERR_OP);
if((in = malloc(cnt * sizeof(double))) == NULL) 
    MPI_Abort(MPI_COMM_WORLD, MPI_ERR_OP);

//Test data generation
//usage of MPI_Send and MPI_Reduce_local
//doing a lot of memcpy, assigning pointer synonyms to in and out, changing data to in and out

free(in);    //crashes here with "munmap_chunk(): invalid pointer" 
free(out);   //and here (if above line is commented out) with "double free or corruption (!prev)"

我使用valgrind运行它:

 mpirun -np 2 valgrind  --leak-check=full --show-reachable=yes  ./foo

并得到以下内容:

==6248== Warning: ignored attempt to set SIGRT32 handler in sigaction();
==6248==          the SIGRT32 signal is used internally by Valgrind
cr_libinit.c:183 cri_init: sigaction() failed: Invalid argument

==6248== HEAP SUMMARY:
==6248==     in use at exit: 0 bytes in 0 blocks
==6248==   total heap usage: 1 allocs, 1 frees, 25 bytes allocated
==6248== 
==6248== All heap blocks were freed -- no leaks are possible
==6248== 
=====================================================================================
=   BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
=   EXIT CODE: 134

有关如何跟踪此错误的任何想法?请注意,它仅在cnt> 2500时出现!

2 个答案:

答案 0 :(得分:2)

如果您正在使用GNU glibc,则可以在运行程序之前将环境变量MALLOC_CHECK_设置为2,以便对内存分配调用进行额外检查 - 详细信息here

答案 1 :(得分:1)

上面的消息,

  

警告:忽略尝试在sigaction()中设置SIGRT32处理程序;该   SIGRT32信号由Valgrind cr_libinit.c:XXX内部使用   cri_init:sigaction()失败:参数无效

与MPI(我的是mpich-3.1.4-9)使用BLCR检查点库(我的是blcr-0.8.5)有关。

当我不支持BLCR时(运行&#34; mpiexec -info&#34;并查看&#34;可用的检查点库和#34;行)Valgrind在我的测试阶段工作正常。

当我重新编译我的MPI以获得BLCR支持(用于检查点实验)时,Valgrind受到心脏病发作。他完全停止了工作。

这个错误(正如程序员所说的那样)非常糟糕,因为很明显这两个程序使用相同的信号来中断你正在运行的程序的中断,而他们根本就不能这样做。 (在我们的例子中,MPI的BLCR首先获得它,现在Valgrind仍然在空中行走。)

我将尝试在同一台机器上运行两个不同的MPI安装(一个支持blcr,一个支持不支持),我希望我能在Valgrind和Checkpoint之间愉快地交替。

更新:

即使Checkpoint本身正在运行,也无法运行任何mpiexec并行可执行文件(之前正在运行的程序)。 当我使用(编译好的)检查点库BLCR时,Mpiexec命令本身崩溃了。

<强> SOLUTION:

我重新编译了MPI(mpich-3.1.4-9)没有 BLCR支持(我完全放了BLCR)并安装了DMTCP检查点解决方案(dmtcp-2.4.4),它不仅可以工作透明,但它也比BLCR快(你会在参考书目中找到基准)。

现在一切都按预期运行:)并且检查点作业的处理也正确完成。将来我会对DMTCP进行更多繁重的测试(我会使用本地文件会很重/并行程序中的活动IO。)

PS。我还发现mpich完全推出了BLCR(2016年7月)。