Python non esegue il dump dei file core


2

Ho un problema in cui un processo Python sta colpendo un errore di segmentazione ma non produce un file core.

Quello che segue è un esempio di giocattolo che non produce un file core nelle seguenti distro:

  • Ubuntu 12.10
  • Fedora 18

ma produce file core nelle seguenti distro:

  • Linux scientifico 6
  • Mac OS X

La riproduzione:

$ python -c 'import time; time.sleep(120)'&    
$ kill -abrt $!   [1]+   
Aborted                 python -c 'import time; time.sleep(120)'  
$ ls core*   ls: cannot access core*: No such file or directory  

Tuttavia, se invio un segnale simile a a sleep istanza ottengo un file principale:

$ sleep 120 &  
$ kill -abrt $!  
[1]+  Aborted                 (core dumped) sleep 120  
$ ls core*  
core.8603  

Sulla mia scatola Fedora 18, ecco la mia /proc/sys/kernel/core_pattern:

$ cat /proc/sys/kernel/core_pattern   
core

E ho impostato il seguente:

$ ulimit -c  
unlimited

Questo è riproducibile indipendentemente dal fatto che il abrtd il servizio è in esecuzione o meno.

Sono abbastanza sicuro di aver perso alcune configurazioni di base, ma non so cosa. Grazie!

MODIFICARE : Questo può essere risolvibile eseguendo:

$ echo 1 >/proc/sys/fs/suid_dumpable

È nucleo un programma sul tuo sistema? Che cosa hai provato? Quale di questi non ha risolto il tuo problema? wiki.ubuntu.com/Apport , ubuntuforums.org/archive/index.php/t-497562.html , stackoverflow.com/questions/5833218/...
Ярослав Рахматуллин

Hai provato a impostare suid_dumpable a 1? (solo root può farlo)
pabouk

Per favore prova a seguire: ls -lL $(which python) ; python -c 'import time; time.sleep(5)' & grep core /proc/$!/limits ; ls -ld "$(readlink /proc/$!/cwd)" ; grep ^Sig /proc/$!/status ; kill $! La sequenza sarà 1. elenca il binario di Python per verificare se non è suid; 2. elenca l'effettivo limite di base del processo per verificare se non è stato modificato; 3. elenca la directory di lavoro del processo per verificare se è scrivibile dall'utente; 4. elenca le maschere di segnalazione del processo - controlla se il file SIGABRT (6) mostrando come 0000000000000020 non è bloccato SigBlk, ignorato SigIgn o catturato SigCgt.
pabouk

Sebbene non sia direttamente correlato all'esempio precedente, se il tuo processo python dovesse utilizzare il modulo "daemon" per metterlo sullo sfondo, il valore predefinito è girare esplicitamente via core dump. È necessario impostare prevent_core = False in DaemonContext per sovrascriverlo.
Eric

Risposte:


1

tl; dr

$ echo 1 >/proc/sys/fs/suid_dumpable

(o l'equivalente in /etc/sysctl.conf per mantenere la modifica tra i riavvii)

più a lungo

Nel mio scenario stavo usando setcap per impostare determinate funzionalità sul mio processo Python, ad es. consentire l'uso di socket raw senza dover essere root. Con questo abilitato è necessario essere root per ottenere un core dump, o usare il comando precedente per dire esplicitamente al kernel che è OK per gli utenti non root ottenere i core dump a cui possono accedere.

(l'impostazione 2 consentirebbe comunque di eseguire core dump in questa situazione, ma i suddetti core core sarebbero accessibili solo dall'utente root).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.