我使用mpi并行运行代码
我的程序终止并显示Assertion (unsigned long)(size) >= (unsigned long)(nb) failed terminated by signal 6
我添加到我的主要尝试并捕获如下
int main(int argc, char *argv[])
{
MPI_Init(&argc, &argv);
int rankid;
MPI_Comm_rank(MPI_COMM_WORLD, &rankid);
try
{
call functions
}
catch(...)
{
cout<<"error from "<<rankid<<endl;
throw;
}
return 0;
}
我正在使用mpicxx example.C
编译我的代码并通过
mpirun -np 2 ./a.out
我的代码在没有在catch中打印短语的情况下终止,是否尝试捕获应该强制我的程序执行catch中的内容
答案 0 :(得分:2)
在某个地方,call functions
中可能会使用assert()
。如果断言失败,则结果是通过调用abort()
退出程序,SIGABRT
(使用您的实现,即编译器/库)生成6
(值abort()
)信号。
问题是,SIGABRT
不需要 - 通常也不 - 抛出C ++异常(因为它是从C继承而来的,这是一种对C ++异常一无所知的语言)。同样,引发abort()
信号(实现在catch(...)
中使用的方式)以与C ++异常无关的方式退出程序。
SIGABRT
子句将捕获的唯一内容是C ++异常。拦截任何导致程序终止的事件并不是一个全能(没有双关语)。
您可以使用signal()
函数拦截call function
信号,以建立适当的信号处理程序。在实践中,找出导致abort()
致电<div class="table-responsive">
<table class="table table-hover table-striped">
<thead>
<tr>
<th>K-ID</th>
<th>Name</th>
<th>Ort</th>
<th></th>
</tr>
</thead>
<tbody>
<div id="results"></div>
</tbody>
</table>
<div class="pagination"></div>
</div>
的原因可能会更有成效。换句话说,确保它声明的条件有效。要弄清楚如何操作,您需要阅读所调用函数的文档。