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
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
@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