Un caso cuando el proceso obtiene SIGABRT de sí mismo: Hrvoje mencionó acerca de un ser virtual puro enterrado llamado desde ctor que generaba un aborto, recreé un ejemplo para esto. Aquí cuando se va a construir d, primero llama a su clase base A ctor, y pasa el puntero interno a sí mismo. el Actor llama al método virtual puro antes de que la tabla se haya llenado con un puntero válido, porque d aún no está construido.
#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;
}
de compilación: g ++ -o aa aa.cpp
ulimit -c unlimited
de ejecución: ./aa
pure virtual method called
terminate called without an active exception
Aborted (core dumped)
Ahora vamos a ver rápidamente el archivo central, y validar que SIGABRT fue llamado:
gdb aa core
ver regs: Código
i r
rdx 0x6 6
rsi 0x69a 1690
rdi 0x69a 1690
rip 0x7feae3170c37
cheque:
DISA 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 sig = 6 = SIGABRT
:)
Hay un par de formas. La forma más fácil, si escribió el programa, es registrar un manejador de señal para SIGABRT que imprime esa información y vacía sus transmisiones antes de regresar. La segunda forma más fácil es ejecutar el programa dentro de la ley. La tercera forma más sencilla es garantizar que el programa genere un archivo central cuando se bloquea y que se descubra a través del volcado del núcleo. –