signal: Alles registriert, nichts empfangen?
-
Hallo
Ich würde gerne zu Debug-Zwecken Falschzugriffe abfangen und loggen und habe dafür einen Haufen Handler registriert.
signal(SIGABRT, SignalHandler); signal(SIGILL, SignalHandler); signal(SIGSEGV, SignalHandler); signal(SIGFPE, SignalHandler); signal(SIGBUS, SignalHandler); signal(SIGPIPE, SignalHandler);
Müsste ich damit nicht in der Lage sein, sowas wie
*((int *)0x123456) = 42;
abzufangen im entsprechenden Handler (SIGSEGV/SIGBUS)? Ich empfange einfach rein gar nichts und das Programm stürzt normal ab.
Was läuft falsch?
-
Es gibt manche Signale, die nicht abgefangen werden können. Laut signal(7) sind das SIGKILL und SIGSTOP, aber ich kann mir gut vorstellen, dass das auch für SIGSEGV gilt (das ist nur Spekulation von mir).
mit signal(2) scheint das nicht zu gehen, mit sigaction(2) schon.
-
hab noch ein altes Testprogramm von mir gefunden, bei dem ich mich auf das Signal SegFault registriert habe.
Dort hat es problemlos funktioniert:#include <stdio.h> #include <ctype.h> #include <signal.h> #include <string.h> void handler(int dummy) { printf("signal erhalten!!!"); exit(0); } int main(int argc,char** argv) { int a=0xAABBCCDD; char* p=0; signal(SIGSEGV,handler); for(p=&argv[0];;++p) { if(!isalpha(*p)) { continue; } printf("%s",p); printf("\n---\n"); p=p+strlen(p)-1; } }