在c++中,进程获得SIGABRT的场景是什么?这个信号总是来自进程内部还是可以从一个进程发送到另一个进程?
有没有办法确定是哪个进程在发送这个信号?
在c++中,进程获得SIGABRT的场景是什么?这个信号总是来自进程内部还是可以从一个进程发送到另一个进程?
有没有办法确定是哪个进程在发送这个信号?
当前回答
libc和其他库通常使用SIGABRT在出现严重错误时中止程序。例如,glibc在检测到double-free或其他堆损坏时发送SIGABRT。
此外,大多数断言实现在断言失败的情况下使用SIGABRT。
此外,SIGABRT可以像其他信号一样从任何其他进程发送。当然,发送进程需要以相同的用户或根用户运行。
其他回答
对于Android原生代码,以下是根据https://source.android.com/devices/tech/debug/native-crash调用abort的一些原因:
中止之所以有趣,是因为它们是有意为之的。中止有许多不同的方法(包括调用abort(3), assert失败(3),使用android特定的致命日志类型之一),但都涉及调用abort。
libc和其他库通常使用SIGABRT在出现严重错误时中止程序。例如,glibc在检测到double-free或其他堆损坏时发送SIGABRT。
此外,大多数断言实现在断言失败的情况下使用SIGABRT。
此外,SIGABRT可以像其他信号一样从任何其他进程发送。当然,发送进程需要以相同的用户或根用户运行。
在我的例子中,这是由于在一个数组中输入的一个索引等于数组的长度。
string x[5];
for(int i=1; i<=5; i++){
cin>>x[i];
}
X[5]正在被访问,但不存在。
abort()向调用进程发送SIGABRT信号,这就是abort()的基本工作方式。
Abort()通常由库函数调用,用于检测内部错误或一些严重破坏的约束。例如,如果malloc()的内部结构被堆溢出破坏,它将调用abort()。
在c++中还有另一个简单的原因。
std::thread::~thread{
if((joinable ())
std::terminate ();
}
例如,线程范围结束,但你忘记调用
thread::join();
or
thread::detach();