2009-09-27 5 views
5

Devo usare Valgrind per rilevare eventuali violazioni di accesso alla memoria eseguite in un'applicazione server. Il server crea molti thread. Sospetto che ci sia una condizione di competizione che causa il crash del server ogni 1 ora circa. Abbiamo usato Valgrind per analizzare l'utilizzo della memoria, ma la velocità del processo del server è diminuita drasticamente. La velocità del server è diminuita a tal punto che era difficilmente utilizzabile e nessuna condizione di gara era probabile.Come eseguire Valgrind in parallelo con il nostro processo in modo che le sue prestazioni non diminuiscano troppo?

Esiste comunque un modo per eseguire Valgrind in parallelo con la nostra applicazione in modo da non perdere così tante prestazioni?

risposta

5

Vale la pena notare che Valgrind, pur supportando programmi multi-thread, non eseguirà in realtà i thread del programma in parallelo se sono disponibili core multi-pin. Interlea inoltre i thread con una grana più fine rispetto allo scheduler del SO nativo. Questi 2 fatti combinati potrebbero far sì che un programma con condizioni di competizione o altre anomalie concorrenti si comporti diversamente.

Si consiglia di provare Helgrind, uno strumento principalmente finalizzato a rilevare la corretta disciplina di blocco e drd, uno strumento principalmente volto a rilevare le corse di dati.

1

Questo non risponde direttamente alla domanda, ma se si sospetta un errore di sincronizzazione, hai provato a utilizzare lo strumento Valgrind Helgrind?

+0

Prima non ero a conoscenza di Helgrind perché non sono un utente Valgrind professionista. Ho appena saputo a riguardo oggi. Ho il sospetto che un oggetto venga eliminato ma un altro thread sta tentando di accedervi e che si blocca il processo. Questo è molto probabile poiché l'applicazione è stata codificata molto male. Proverò Helgrind e vedrò cosa può offrire. –

9

Non puoi farlo. Valgrind in realtà non esegue il codice in modo nativo, ma lo esegue all'interno di un simulatore. Ecco perché è così lento. Quindi, non c'è modo di farlo funzionare più velocemente e ottenere comunque il vantaggio di Valgrind.

La soluzione migliore è impostare ulimit in modo che il programma generi un file di base quando si arresta in modo anomalo. Quindi puoi provare a capire qual è il problema esaminando il nucleo.

+1

+1, stavo per dare una risposta quasi identica. –

0

Valgrind funziona collegandosi alle chiamate di malloc, quindi è possibile che il programma venga eseguito più lentamente con valgrind. Quindi, direi che non è possibile eseguire il programma più velocemente con valgrind e ottenere il vantaggio di analizzare gli errori di memoria.