Metodi / Strumenti per risolvere un mistero Segfault durante il funzionamento a condor

StackOverflow https://stackoverflow.com/questions/3681755

  •  02-10-2019
  •  | 
  •  

Domanda

Sto scrivendo un'applicazione C che è gestito attraverso un cluster di calcolo (usando condor). Ho provato molti metodi per rivelare il codice offendere ma senza alcun risultato.

Gli indizi:

  • Nella media quando si esegue il codice a 15 macchine per 2 giorni, ottengo due o tre segfaults (segnale 11).
  • Quando eseguo il codice a livello locale non ottengo un segfault. Mi sono imbattuto per quasi 3 settimane sulla mia macchina a casa.

Tentativi:

  • mi sono imbattuto il codice in Valgrind per quattro giorni a livello locale, senza errori di memoria.
  • I catturato il segnale segfault definendo il mio gestore di segnale in modo che può produrre alcune delle stato del programma.
  • Ora, quando un segfault accade posso stampare lo stack corrente utilizzando backtrace.
  • posso stampare i valori delle variabili.
  • Ho creato una variabile che è impostato per il numero di riga corrente.
  • hanno cercato anche commentando pezzi di codice fuori, sperando che se il problema va via io scoprire la segfault.

Purtroppo il numero di linea in uscita è abbastanza casuale. Io non sono del tutto sicuro che cosa posso fare con lo stacktrace. Ho ragione nel ritenere che registra solo l'indirizzo della funzione in cui avviene la segfault?

I sospetti:

  • Ho il sospetto che il sistema di controllo di puntamento quali usi Condor per spostare i lavori tra macchine è più sensibile alla corruzione della memoria e questo è il motivo per cui non vedo a livello locale.
  • che gli indici vengono danneggiati dal bug, e che questi indici stanno causando il segfault. Questo spiegherebbe il fatto che i segmentation fault si verificano su numeri di riga abbastanza casuali.

Aggiorna

la ricerca di questo un po 'ho trovato i seguenti link:

UPDATE 2

Greg suggerito guardando il registro Condor e 'correlare le segfaults a quando Condor riavvia l'eseguibile da un posto di blocco'. Guardando il registra i segfaults tutti si verificano immediatamente dopo il riavvio. Tutti i fallimenti sembrano verificarsi quando un processo passa da un tipo di macchina ad un altro tipo.

UPDATE 3

Il segfault è stato causato da differenze tra i padroni di casa, impostando campo '' requiremets nel condor inviare file problema completamente scomparso.

Si può impostare singole macchine:

requirements = machine == "hostname1" || machine == "hostname2"

o un'intera classe di macchine:

requirements = classOfMachinesName

qui

È stato utile?

Soluzione

se è possibile, compilare con il debug, e correre sotto gdb. in alternativa, ottenere nucleo dumping e carico che nel debugger.

mpich ha debugger incorporato, oppure è possibile acquistare debugger parallelo commerciale.

Poi si può fare un passo attraverso il codice per vedere cosa succede in debugger

http://nmi.cs.wisc.edu/node/1610

http://nmi.cs.wisc.edu/node/1611

Altri suggerimenti

Si può creare un core dump quando il segfault succede? È quindi possibile eseguire il debug di questa discarica a cercare di capire lo stato del codice quando si è schiantato.

Guardate quello che ha causato l'errore di istruzioni. Era anche un'istruzione valida o stai cercando di eseguire i dati? Se valido, ciò che la memoria è che il tentativo di accesso? Da dove viene questo puntatore viene da. È necessario restringere la posizione della colpa vostra (la corruzione dello stack, danneggiamento di heap, puntatore non inizializzato, accedere alla memoria non valida). Se si tratta di una corruzione, vedere se se ci sono tutti i dati rivelatori nella zona danneggiata (i puntatori ai simboli, i dati che assomiglia a qualcosa nelle vostre strutture, ...). Il tuo allocatore di memoria potrebbe essere già costruito nel funzionalità per eseguire il debug certa corruzione (vedi MALLOC_CHECK_ su Linux o MallocGuardEdges su Mac OS). Un caso comune per questi è utilizzare la memoria che è stato libero () 'd, quindi la registrazione tua malloc () / free () coppie potrebbe aiutare.

Se si è utilizzato lo strumento condor_compile di ricollegare il codice con il codice condor checkpoint, che fa alcune cose in modo diverso rispetto un normale link. Ancora più importante, collega in modo statico il codice, e gli usi di essa la propria malloc. Un'altra grande differenza è che condor sarà quindi eseguirlo su una macchina straniera, dove l'ambiente può essere abbastanza diverso da quello che ci si aspetta di causare problemi.

L'eseguibile generato da condor_compile è eseguibile come fuori standalone binaria del sistema condor. Se si esegue il binario emessa dal condor_compile a livello locale, al di fuori del condor, si fa ancora vedere i segfaults?

In caso contrario, si può correlare le segfault a quando Condor riavvia l'eseguibile da un posto di blocco (il registro utente vi dirà quando questo accade).

È provato la maggior parte di quello che avevo in mente. L'unica altra cosa che suggerirei è iniziare ad aggiungere un sacco di codice di registrazione e di speranza si può restringere il campo in cui l'errore sta accadendo.

L'unica cosa che non si dice è quanta flessibilità si deve risolvere il problema. Si può, per esempio, che il sistema si fermi e basta eseguire l'applicazione? Inoltre, quanto sono importanti questi incidenti da risolvere?

Io parto dal presupposto che per la maggior parte si fa. Ciò può richiedere un sacco di risorse.

Il passo breve termine è quello di mettere tonnellate di "asserisce" (manoscritta semi) di ciascuna variabile per assicurarsi che non è cambiata quando non si desidera. Questo può CContinua al lavoro come si passa attraverso il processo a lungo termine.

Long term-- provare a eseguirlo su un cluster di due (forse il tuo computer di casa e una macchina virtuale). Non si vede ancora i segfaults. Se non aumentare la dimensione dei cluster fino a quando si inizia a vedere segfault.

Esegui su una configurazione minima (per ottenere segfaults) e registrare tutti i tuoi ingressi fino a un crash. Automatizzare l'esecuzione del sistema con gli ingressi che avete registrato, li tweaking fino a quando si può ottenere un crash coerente con un input minimo.

A quel punto un'occhiata in giro. Se ancora non riesce a trovare il bug, allora si dovrà chiedere di nuovo con alcuni dati aggiuntivi si sono riuniti con i funzionamenti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top