Случай, когда процесс получает SIGABRT от себя: Hrvoje упомянул о захороненном чистом виртуальном существе, вызванном из ctor, производящем прерывание, я воссоздал пример для этого. Здесь, когда d должен быть сконструирован, он сначала вызывает свой базовый класс A ctor, и передает внутрь указатель на себя. A ctor вызывает чистый виртуальный метод до того, как таблица была заполнена действительным указателем, , потому что d еще не сконструирован.
#include<iostream>
using namespace std;
class A {
public:
A(A *pa){pa->f();}
virtual void f()=0;
};
class D : public A {
public:
D():A(this){}
virtual void f() {cout<<"D::f\n";}
};
int main(){
D d;
A *pa = &d;
pa->f();
return 0;
}
компиляции: г ++ -o аа aa.cpp
ULIMIT -c неограниченная
пробег: ./aa
pure virtual method called
terminate called without an active exception
Aborted (core dumped)
теперь позволяет быстро увидеть файл ядра и проверки что SIGABRT действительно был вызван:
gdb aa core
см: регистры
i r
rdx 0x6 6
rsi 0x69a 1690
rdi 0x69a 1690
rip 0x7feae3170c37
контрольный код:
disas 0x7feae3170c37
mov $0xea,%eax = 234 <- this is the kill syscall, sends signal to process
syscall <-----
http://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/
234 sys_tgkill pid_t tgid pid_t PID INT сиг = 6 = SIGABRT
:)
Есть несколько способов. Самый простой способ, если вы написали программу, - зарегистрировать обработчик сигналов для SIGABRT, который распечатывает эту информацию и очищает свои потоки перед возвратом. Второй самый простой способ - запустить программу в рамках strace. Третий самый простой способ - обеспечить, чтобы программа генерировала основной файл, когда он сбой, и узнайте через дамп ядра. –