在c++中,进程获得SIGABRT的场景是什么?这个信号总是来自进程内部还是可以从一个进程发送到另一个进程?
有没有办法确定是哪个进程在发送这个信号?
在c++中,进程获得SIGABRT的场景是什么?这个信号总是来自进程内部还是可以从一个进程发送到另一个进程?
有没有办法确定是哪个进程在发送这个信号?
当前回答
在c++中还有另一个简单的原因。
std::thread::~thread{
if((joinable ())
std::terminate ();
}
例如,线程范围结束,但你忘记调用
thread::join();
or
thread::detach();
其他回答
GNU libc将在调用abort()(然后触发SIGABRT)之前将有关一些致命条件的信息打印到/dev/tty,但是如果您将程序作为服务运行,或者不是在真正的终端窗口中运行,那么这些消息可能会丢失,因为没有tty来显示这些消息。
请参阅我关于将libc重定向到stderr而不是/dev/tty的帖子:
捕捉libc错误消息,从/dev/tty重定向
它通常发生在内存分配有问题的时候。
当我的程序试图分配一个 大小为负的数组。
关于第一个问题:在c++中进程获得SIGABRT的场景是什么?
我可以想到两种c++程序自动中止的特殊情况——不是通过直接调用std::abort()或std::terminate():
一:在处理异常时抛出异常。
try {
throw "abc";
}
catch (...) {
throw "def"; // abort here
}
二:试图在main()外部传播的未捕获异常。
int main(int argc, char** argv)
{
throw "abc"; // abort here
}
c++专家可能还能举出更多的特殊情况。
在这些参考页面上也有很多好的信息:
https://en.cppreference.com/w/cpp/utility/program/abort https://en.cppreference.com/w/cpp/error/terminate
你可以使用kill(2)接口向任何进程发送任何信号:
杀死 -SIGABRT 30823
30823是我启动的一个破折号进程,所以我可以很容易地找到我想要终止的进程。
$ /bin/dash
$ Aborted
Aborted输出显然是dash报告SIGABRT的方式。
它可以使用kill(2)直接发送给任何进程,或者进程可以通过assert(3)、abort(3)或raise(3)将信号发送给自己。
对于Android原生代码,以下是根据https://source.android.com/devices/tech/debug/native-crash调用abort的一些原因:
中止之所以有趣,是因为它们是有意为之的。中止有许多不同的方法(包括调用abort(3), assert失败(3),使用android特定的致命日志类型之一),但都涉及调用abort。