Раскручивается ли стек при возникновении SIGABRT?

StackOverflow https://stackoverflow.com/questions/1878539

  •  18-09-2019
  •  | 
  •  

Вопрос

Раскручивается ли стек (запускаются деструкторы), когда в C++ происходит SIGABRT?

Спасибо.

Это было полезно?

Решение

Этот ответ указывает, что деструкторы не вызываются.

Другие советы

Нет:

$ cat test.cc
#include <iostream>
#include <sys/types.h>
#include <signal.h>

class Test {
public:
   ~Test() { std::cout << "~Test called" << std::endl; }
};

int main(int argc, char *argv[])
{
   Test t = Test();
   if (argc > 1) {
      kill(0, SIGABRT);
   }
   return 0;
}
$ g++ test.cc
$ ./a.out
~Test called
$ ./a.out 1
Aborted

Нет, только исключения вызывают разматывание стека.Сигналы являются частью POSIX, который представляет собой C API, поэтому он не «осведомлен» о таких возможностях C++, как исключения.

А signal(3) На странице руководства в моем ящике Mac OS X написано:

  No    Name         Default Action       Description
...
 6     SIGABRT      create core image    abort program (formerly SIGIOT)

что подсказывает мне, что по умолчанию не расслабляться...

сигнал SIGABRT некоторое время используется для создания основного файла работающего приложения.Мы некоторое время используем этот сигнал для отладки приложения.И насколько я знаю, деструкторы не вызываются этим сигналом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top