2009-05-27 18 views
9

Ho un'applicazione C++ multithreading linux. Ora è testato sui server di produzione e ha segfault. Il problema è che non riesco a riprodurre quell'errore su nessuno dei miei server di prova e non ho accesso ai server di produzione. Non ho discariche o altre informazioni utili. Solo la linea: segfault a 0000000046bf0fb8 rip 000000000048ac6b RSP 0000000046bf0fa0 errore 6Linux/C++ Come eseguire il debug dell'applicazione di rilascio

Vorrei chiedere comunità posso ottenere da tale linea alcune informazioni che vi aiuteranno a diminuire zona di possibili luoghi dove dovrei cercare. Non riesco a eseguire il debug build sulla produzione a causa della sua bassa velocità. Cosa posso aggiungere al rilascio che mi aiuta a eseguire il debug? Questo bug sembra un bug multithread e difficile da riprodurre. Ma non ne sono sicuro, perché l'applicazione funziona con molte e-mail diverse da MTA.

Piattaforma: Linux

linea Compiler: g ++ -O3 -D_REENTRANT

Grazie.

upd .: Grazie per le vostre risposte. Posso includere informazioni di debug. Mi piacerebbe conoscere i metodi di base per il debug delle versioni di rilascio. Ad esempio ho scaricato e versione di rilascio. Come dovrei continuare Cosa dovrei leggere a riguardo? Puoi spiegare in poche parole come esegui il debug dell'applicazione, se possibile? Grazie.

risposta

5

Ho letto i manuali gdb di recente e raccomandano di lasciare i simboli di debugging ad es. g++ -g.

Poiché non si ha accesso al server di produzione, è possibile includere alcune funzionalità di registrazione di base che generano i dati in un file di testo. Dovresti essere in grado di restringere approssimativamente dove si verifica l'errore, a seconda di quali dati sono stati inviati al tuo file di registro.

12

Come detto da Andy, lasciare i simboli di debugging quando si fanno i build di rilascio.

Se questo rende inaccettabilmente grande la dimensione dell'eseguibile finale, è possibile eseguire una copia dell'eseguibile finale ed eseguirla tramite strip per rimuovere i simboli di debug. In questo modo hai due eseguibili identici tranne uno ha i simboli di debug e l'altro no. Metti quello senza simboli sul server di produzione. Quando segfaults, esegue il debug della copia dell'eseguibile che contiene ancora i simboli di debug.

3

È possibile (e dovrebbe) creare gli eseguibili di rilascio con informazioni di debug. Se non si desidera distribuire i file eseguibili che contengono le informazioni di debug, è possibile immettere separate le informazioni di debug e installarle in un secondo momento per il debug. Questo è ciò che facciamo nella nostra applicazione.

+0

Grazie. Posso includere informazioni di debug. Mi piacerebbe conoscere i metodi di base per il debug delle versioni di rilascio. Ad esempio ho scaricato e versione di rilascio. Come dovrei continuare Cosa dovrei leggere a riguardo? Puoi spiegare in poche parole come esegui il debug dell'applicazione, se possibile? Grazie. – Dmitriy

+0

@Dmitriy Il debug delle versioni di rilascio non è in alcun modo diverso dal debug di build di debug. Potresti provare che non puoi vedere determinate variabili quando passi attraverso il codice, poiché il compilatore potrebbe averle ottimizzate lontano da quella posizione, ma altrimenti è uguale al debug di una build non di rilascio. – lothar

4

È possibile utilizzare gdb per ottenere un backtrace del proprio programma nel punto in cui è segmentato, anche se non è stata creata l'applicazione con i flag di debug. Questo ti darà almeno un'idea su dove si trova l'applicazione segfaults.

gdb <your_app_exe> 
gdb> run 
gdb> backtrace 

o

gdb <your_app_exe> 
gdb> core-file <generated_core_file> 
1

così ho trovato un'altra soluzione, che i m utilizzando molto frequentemente, normalmente otteniamo lo stack (che abbiamo ottenuto in questo caso).

Ho un file eseguibile che distribuiamo su alcune piattaforme embedded. diciamo che il mio eseguibile è il server. io uso addr2line -e./ server e incollo lo stack ricevuto dal cliente. ti fornirà i dettagli della linea in cui si verifica il problema.

potrebbe aiutarti.

Grazie

Problemi correlati