在c++中,进程获得SIGABRT的场景是什么?这个信号总是来自进程内部还是可以从一个进程发送到另一个进程?

有没有办法确定是哪个进程在发送这个信号?


当前回答

它通常发生在内存分配有问题的时候。

当我的程序试图分配一个 大小为负的数组。

其他回答

错误munmap_chunk无效指针也会导致SIGABRT,在我的情况下,它很难调试,因为我根本没有使用指针。事实证明,它与std::sort()有关。

Std::sort()需要一个比较函数来创建严格的弱排序!这意味着当a==b成立时,比较器(a, b)和比较器(b, a)都必须返回false。(参见https://en.cppreference.com/w/cpp/named_req/Compare)在我的例子中,我在我的结构中定义了操作符<,如下所示:

bool operator<(const MyStruct& o) const {
    return value <= o.value; // Note the equality sign
}

这导致了SIGABRT,因为函数没有创建严格的弱顺序。删除=解决了问题。

它通常发生在内存分配有问题的时候。

当我的程序试图分配一个 大小为负的数组。

对于Android原生代码,以下是根据https://source.android.com/devices/tech/debug/native-crash调用abort的一些原因:

中止之所以有趣,是因为它们是有意为之的。中止有许多不同的方法(包括调用abort(3), assert失败(3),使用android特定的致命日志类型之一),但都涉及调用abort。

你可以使用kill(2)接口向任何进程发送任何信号:

杀死 -SIGABRT 30823

30823是我启动的一个破折号进程,所以我可以很容易地找到我想要终止的进程。

$ /bin/dash
$ Aborted

Aborted输出显然是dash报告SIGABRT的方式。

它可以使用kill(2)直接发送给任何进程,或者进程可以通过assert(3)、abort(3)或raise(3)将信号发送给自己。

abort()向调用进程发送SIGABRT信号,这就是abort()的基本工作方式。

Abort()通常由库函数调用,用于检测内部错误或一些严重破坏的约束。例如,如果malloc()的内部结构被堆溢出破坏,它将调用abort()。