Ho eseguito il debug di un programma Python che segfaults dopo aver ricevuto un'eccezione KeyboardInterrupt
. Questo viene normalmente eseguito premendo Ctrl + C dalla shell. Per verificare se un particolare cambiamento di codice ha corretto il bug, ho avuto un piccolo script di shell che ha inviato SIGINT
al programma in un momento casuale dopo l'avvio. Il problema che ho è che l'invio di Ctrl + C sembra avere un effetto diverso sul programma rispetto all'invio del segnale SIGINT
e quindi non causa la comparsa del bug, quindi mi chiedo quale sia la differenza tra le due azioni.Qual è la differenza tra Ctrl-C e SIGINT?
Il programma non cattura alcuna azione della tastiera, ed è solo un programma python con alcuni thread/processi in essi. Non installa gestori di segnale (anche se Python lo fa), e stty -a
dà intr = ^C
. Sospetto che potrebbe essere che Ctrl + C invii SIGINT
a tutti i processi secondari/thread mentre kill -INT
invia solo al processo primario, ma questo è il mio sospetto.
Ecco lo script della shell che invia lo kill -INT
.
wait
while :; do
seconds="$(python -c 'import random; print random.random()*4')"
./mandos --debug --configdir=confdir \
--statedir=statedir --no-restore --no-dbus &
pid=$!
{ sleep $seconds; kill -INT $pid; } &
fg %./mandos
status=$?
if [ $status -gt 1 ]; then
echo "Failed exit $status after $seconds seconds"
break
fi
wait
done
Non sono sicuro di quanta differenza sarebbe, ma il suo eventuale ctrl + c sta inviando 'SIGTERM' invece di' SIGINT'. Inoltre, quando gestisci l'eccezione stai pulendo correttamente i tuoi sottoprocessi/thread? Il modo in cui Python gestisce i thread non credo che sarebbe un errore seg, ma probabilmente è possibile con processi secondari. – David
c'è del multithreading nel codice? – Casey