When does a process get SIGABRT (signal 6)?

2019-01-02 15:09发布

What are the scenarios where a process gets a SIGABRT in C++? Does this signal always come from within the process or can this signal be sent from one process to another?

Is there a way to identify which process is sending this signal?

标签: c++ sigabrt
8条回答
爱死公子算了
2楼-- · 2019-01-02 15:30

You can send any signal to any process using the kill(2) interface:

kill -SIGABRT 30823

30823 was a dash process I started, so I could easily find the process I wanted to kill.

$ /bin/dash
$ Aborted

The Aborted output is apparently how dash reports a SIGABRT.

It can be sent directly to any process using kill(2), or a process can send the signal to itself via assert(3), abort(3), or raise(3).

查看更多
低头抚发
3楼-- · 2019-01-02 15:34

In my case, it was due to an input in an array at an index equal to the length of the array.

string x[5];

for(int i=1; i<=5; i++){

    cin>>x[i];

}

x[5] is being accessed which is not present.

查看更多
其实,你不懂
4楼-- · 2019-01-02 15:37

There's another simple cause in case of c++.

std::thread::~thread{
    if((joinable ())
        std::terminate ();
}

i.e. scope of thread ended but you forgot to call either

thread::join();

or

thread::detach();
查看更多
姐姐魅力值爆表
5楼-- · 2019-01-02 15:38

SIGABRT is commonly used by libc and other libraries to abort the program in case of critical errors. For example, glibc sends an SIGABRT in case of a detected double-free or other heap corruptions.

Also, most assert implementations make use of SIGABRT in case of a failed assert.

Furthermore, SIGABRT can be sent from any other process like any other signal. Of course, the sending process needs to run as same user or root.

查看更多
看淡一切
6楼-- · 2019-01-02 15:41

It usually happens when there is a problem with memory allocation.

It happened to me when my program was trying to allocate an array with negative size.

查看更多
若你有天会懂
7楼-- · 2019-01-02 15:43

The GNU libc will print out information to /dev/tty regarding some fatal conditions before it calls abort() (which then triggers SIGABRT), but if you are running your program as a service or otherwise not in a real terminal window, these message can get lost, because there is no tty to display the messages.

See my post on redirecting libc to write to stderr instead of /dev/tty:

Catching libc error messages, redirecting from /dev/tty

查看更多
登录 后发表回答