Ho impostato i punti di interruzione in uscita e _exit e il mio programma (applicazione multithread, in esecuzione su Linux 2.6.16.46-0.12 SLES10), è in qualche modo ancora uscire in un modo che non riesco a trovarel'impostazione di un breakpoint di uscita gdb non funziona?
(gdb) c ... [New Thread 47513671297344 (LWP 15279)] [New Thread 47513667103040 (LWP 15280)] [New Thread 47513662908736 (LWP 15281)] Program exited with code 0177. (gdb)
l'uscita le funzioni risiedono in libc quindi non ci sono problemi di libreria condivisa con carico posticipato. Qualcuno sa di qualche altro innesco misterioso per l'uscita che non può essere catturato?
EDIT: il problema è ora solo accademica. Ho provato il debugging della ricerca binaria, facendo uscire un sottoinsieme delle mie modifiche (il problema è andato via). Dopo averli applicati di nuovo in sequenza, non riesco più a riprodurre il problema, anche con le cose ripristinate allo stato originale.
EDIT2: ho trovato una ragione per questo tipo di errore di recente, che potrebbe essere stata la fonte originale per questo problema. Per ragioni storiche, il nostro prodotto utilizza la flag maligna del linker -Bsymbolic. Tra gli effetti collaterali di questo è che quando un simbolo non è definito, ma chiamato, il runtime linker GLIBC sarà bombardare esattamente in questo modo, e lo si vede nel debugger come un processo terminato con 0177. Quando il linker runtime interrompe in questo modo, io Suppongo che faccia syscall su _exit direttamente (piuttosto che usare la libreria di runtime C exit() o _exit()). Ciò sarebbe coerente con il fatto che non sono riuscito a rilevare ciò con i punti di uscita nel debugger.
Proverò a creare gdb 7 e a vedere cosa mostra. il * e dà lo stesso indirizzo di istruzione:
(Sembra una chiamata di sistema abbastanza standard). Penso di aver almeno isolato il cambio di codice che porta a questa misteriosa uscita, ma non capisco ancora i dettagli. –Sarebbe meglio usare 'catch syscall exit' e' catch syscall exit_group' invece di valori numerici. Ad esempio, sul mio sistema, 'exit' è' [1] 'not' [60] '. – Ruslan
Inoltre, è possibile impostare entrambi contemporaneamente con 'catch syscall exit exit_group'. In effetti, modificandolo ora ... –