2012-11-15 11 views
11

Sto eseguendo un programma ed è interrotto dall'errore di segmentazione. Il problema è che viene creato il file di dump di base, ma di dimensione zero.File dump core vuoto dopo errore di segmentazione

Avete sentito parlare di un caso del genere e come risolverlo?

Ho abbastanza spazio sul disco. Ho già eseguito ulimit -c unlimited per limitare la dimensione del file core, sia eseguendolo sia posizionando la parte superiore del file batch inviato, ma mantenendo comunque i file di core core a 0 byte. Le autorizzazioni della cartella contenente questi file sono uog + rw e le autorizzazioni sui file core creati sono solo u + rw.

Il programma è scritto da C++ e inviato su un cluster Linux con il comando qsub di Grid Engine, non so che questa informazione sia pertinente o meno a questa domanda.

+0

Si dispone di spazio libero sull'unità che presumo? –

+0

Quali sono le autorizzazioni di scrittura sul file a lunghezza zero? – eh9

+0

Domande successive: quali sono i permessi sulla directory che li contiene? Il processo è in esecuzione con un ID utente efficace diverso dal proprietario della directory? – eh9

risposta

5

Sembra che tu stia utilizzando un pianificatore di batch per avviare il tuo eseguibile. Forse la shell che Torque/PBS sta usando per generare il tuo lavoro eredita un valore ulimit differente? Forse la configurazione di default dello scheduler non è quella di preservare i core dump?

È possibile eseguire il programma direttamente dalla riga di comando?

Oppure se si aggiunge ulimit -c unlimited e/o ulimit -s unlimited all'inizio dello script batch PBS prima di richiamare il file eseguibile, è possibile sovrascrivere il comportamento ulimit predefinito di PBS. O aggiungendo 'ulimit -c' potrebbe segnalare qual è il limite è comunque.

+0

Inserisco sia 'ulimit -c unlimited' e 'ulimit -s unlimited' nello script batch PBS, ma i core dump sono ancora vuoti! – Ali

+1

Qual è il filesystem che si sta utilizzando per scaricare il core? –

6

impostazione ulimit -c unlimited attivato generazione di discariche. per default i core dump sono stati generati nella directory corrente che era su nfs. l'impostazione /proc/sys/kernel/core_pattern a /tmp/core mi ha aiutato a risolvere il problema delle discariche vuote.

Il comment from Ranjith Ruban mi ha aiutato a sviluppare questa soluzione alternativa.

Qual è il filesystem che si sta utilizzando per il dumping del core?

+0

Ho appena avuto questo problema su un'immagine VirtualBox Linux con un filesystem vboxsf mappato a un'unità NTFS (l'unità del computer host). –

+0

modifica di core_pattern mentre l'utente root fa miracoli! Il percorso dell'unità NFS ha reso i file core zero byte. http://stackoverflow.com/a/12760552/999943 Oltre a impostare il percorso in cui viene creato, esiste una sintassi elegante per modificare anche il modo in cui viene chiamato un file principale. http://www.linuxhowtos.org/Tips%20and%20Tricks/coredump.htm – phyatt

0

È possibile impostare i limiti delle risorse come la memoria fisica richieste utilizzando qsub opzione come -l h_vmem=6G a reserver 6 GB di memoria fisica.

Per i blocchi di file è possibile impostare h_fsize sul valore appropriato.

Vedere RESOURCE LIMITS sezione qconf manpage:

http://gridscheduler.sourceforge.net/htmlman/htmlman5/queue_conf.html

s_cpu  The per-process CPU time limit in seconds. 

s_core The per-process maximum core file size in bytes. 

s_data The per-process maximum memory limit in bytes. 

s_vmem The same as s_data (if both are set the minimum is 
      used). 
h_cpu  The per-job CPU time limit in seconds. 

h_data The per-job maximum memory limit in bytes. 

h_vmem The same as h_data (if both are set the minimum is 
      used). 

h_fsize The total number of disk blocks that this job can 
      create. 

Inoltre, se cluster utilizza TMPDIR locale a ciascun nodo, e che si sta riempiendo, è possibile impostare TMPDIR di posizione alternativa con più capacità, ad es Condivisione NFS:

export TEMPDIR=<some NFS mounted directory> 

poi lanciare qsub con la possibilità di esportare -V contesto attuale al lavoro.

Uno o una combinazione di quanto sopra può aiutare a risolvere il tuo problema.

0

Se si esegue il file principale in un'unità montata.Il file core non può essere scritto su un'unità montata ma deve essere scritto nell'unità locale.

È possibile copiare il file nell'unità locale.