2017-09-28 5 views
1

Ich entwickle eine Multithread-Anwendung auf Linux PC-Kernel-Version 4.4.14. Ich möchte einige katastrophale Fehler verfolgen, die einen Segmentierungsfehler verursachen. Ich habe einen mit SIGSEGV verbundenen Signalhandler eingerichtet, um die PID-Nummer des Threads zu erhalten, der den Absturz verursacht hat. Der Handler Funktionscode ist die folgende:Signal SIGSEGV Gefangen mit Sigaction

void sighandler(int signum, siginfo_t *siginfo, void *context) 
{ 
    // get pid of sender, 
    pid_t sender_pid = siginfo->si_pid; 
    printf("Process %d got signal %d SEG FAULT !!!\n", (int)sender_pid, signum); 
    fflush(stdout); 
    sleep(1); 
    printf("Stdout Flushed %d got signal %d SEG FAULT !!!\n", sender_pid, signum); 
    trappola.sa_flags = 0; 
    trappola.sa_handler = SIG_DFL; 
    sigaction(signum, &trappola, NULL); 
    kill(getpid(), signum); 
    exit(-1); 
} 

und in der main() Ich verbinde die sighandler Funktion:

struct sigaction trappola; 
memset(&trappola, 0x00, sizeof(trappola)); 

trappola.sa_flags = SA_SIGINFO; 
trappola.sa_sigaction = sighandler; 
sigaction(SIGSEGV, &trappola, NULL); 

der Handler arbeiten, aber ich bin nicht in der Lage, die pid des bekommen Thread verursacht den Fehler. Der printf:

immer unterschiedliche Zahlen als sender_pid keine davon sinnvoll sind. Warum kann ich nicht die PID des anstößigen Threads bekommen?

Wo liege ich falsch? Wie kann ich die PID des störenden Threads in der Handler-Funktion erhalten?

Vielen Dank für jede Hilfe.

Grüße.

Marco Bisio

Antwort

0

siginfo->si_pid ist nicht sinnvoll, weil der Thread die SIGSEGV verursacht (an der Adresse siginfo->si_addr) der gleiche Faden ist, der das Signal empfängt.

Siehe the signal(7) manpage:

ein Signal erzeugt werden kann (und damit pending) für einen Prozess als Ganzes (zB bei Verwendung von kill (2) gesendet werden) oder für einen bestimmten Thread (zB bestimmte Signale, wie SIGSEGV und SIGFPE als Folge erzeugt eine bestimmte Maschinensprachbefehlsausführungs Faden gerichtet sind (...)

+0

Vielen Dank für Ihre Antwort. Seien Patient, aber der Thread Trowing Sigsegv scheint mir nicht gleich das Empfangen des Signals innerhalb der Handler. Ich meine: main() installiert den Handler und führt den Thread mit pthread_create ....; Danach hat der Thread eine eigene PID-Nummer. Ich erwartete, dass ich diese PID-Nummer vom Handler lesen konnte, indem ich siginfo-> si_pid verwendete; Nochmals vielen Dank Marco Bisio – mrcbis

+0

@mrcbis Sie sagen uns nicht, was Sie Ding macht das ist nicht der gleiche Thread. Verwenden Sie einen Debugger ('gdb') und Sie werden wissen, was den segfault verursacht. – xhienne

Verwandte Themen