有没有与信号无关的崩溃

时间:2018-04-20 09:55:13

标签: linux

Linux中的崩溃报告通常如下所示:

[jack-VirtualBox:14564] *** Process received signal ***
[jack-VirtualBox:14564] Signal: Segmentation fault (11)
[jack-VirtualBox:14564] Signal code:  (-6)
[jack-VirtualBox:14564] Failing at address: 0x3e8000038e4
[jack-VirtualBox:14564] [ 0] /lib/x86_64-linux-gnu/libpthread.so.0(+0x11390)[0x7f1c048f0390]
[jack-VirtualBox:14564] [ 1] /lib/x86_64-linux-gnu/libpthread.so.0(raise+0x29)[0x7f1c048f0269]
[jack-VirtualBox:14564] [ 2] ../test/send_recv[0x400b6c]
[jack-VirtualBox:14564] [ 3] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7f1c04535830]
[jack-VirtualBox:14564] [ 4] ../test/send_recv[0x4009d9]
[jack-VirtualBox:14564] *** End of error message ***

一个程序通过软件或硬件执行意外操作。信号被发送到该程序,(1)由信号处理程序(2)处理的信号没有信号处理程序注册,默认处理程序被触发。

所以看起来程序的所有崩溃和挂起都与信号有关。碰撞或挂起是否有可能不是由信号引起的?

2 个答案:

答案 0 :(得分:0)

嗯,这取决于你如何定义崩溃挂起

我会将 crash 定义为导致程序停止的异常情况。 hang 是一种异常情况,会导致您的程序无法正常工作。

例如,您可以考虑与此相当的代码:

while (true) ;

实际上是一个挂起,即使进程没有完成也没有发出信号。

请注意,您不需要按字面意义编写无限循环。例如,代码如:

int y = ...;
for (unsigned char x = 0; x < y; ++x)
{ /*...*/ }
如果y恰好大于255,

挂起

关于崩溃,用C ++编写:

int main()
{
    try
    {
        return real_main();
    }
    catch (...)
    {
        std::cerr << "unhandled exception" << std::endl;
        return 1;
    }
}

然后,任何意外的异常都将完成程序,但它也不会引发任何信号。这是撞车吗?它当然看起来像一个......

其他例子:

void *safe_malloc(size_t sz)
{
    void *m = malloc(sz);
    if (m == 0)
    {
        fprintf(stderr, "out of memory error\n");
        exit(99);
    }
    return m;
}
#define malloc safe_malloc

现在,malloc失败崩溃而不会发出信号。

PS:也许我应该拨打abort()而不是exit(99),但abort()实际上会引发SIGABRT,所以这会打破我的榜样。

答案 1 :(得分:0)

有些崩溃不是由信号引起的。在Linux中,当操作系统决定您的进程必须死亡时,就会发生这种情况。

  • kill -9 [pid]
    有人派了SIGKILL。这不是一个真实的信号。操作系统只是在极端偏见的情况下终止你的程序。

  • OOM(内存不足)
    系统内存不足,但需要更多。如果Linux使用过度提交,它承诺可以提供更多的内存。所以它杀了一些东西。这可能是你的计划。它倾向于选择最大的内存用户,所以如果你有内存泄漏,你可能会得到这个&#34;崩溃&#34;经常。没有信号。只是死亡。