Ho un'applicazione cross-platform molto complessa. Recentemente il mio team ed io abbiamo eseguito test di stress e abbiamo riscontrato diversi arresti anomali (e core dump che li accompagnavano). Alcuni di questi dump di core sono molto precisi e mostrano la posizione esatta in cui si è verificato l'arresto anomalo con circa 10 o più frame di stack. Altri a volte hanno solo un frame stack con ?? essere l'unico simbolo!Come aumentare la probabilità che i core dump di Linux corrispondano ai simboli?
Quello che mi piacerebbe sapere è:
- C'è un modo per aumentare la probabilità di core dump che punta nella direzione giusta?
- Perché il numero di frame di stack non è coerente?
- Qualsiasi best practice consiglia di gestire i core dump.
Ecco come compilo i binari (in modalità di rilascio):
- compilatore e la piattaforma: g ++ con glibc-2.3.2-95.50 su CentOS 3.6 x86_64 - Questo mi aiuta a mantenere la compatibilità con i vecchi versioni di Linux.
- Tutti i file sono compilati con il flag -g.
- I simboli di debug vengono eliminati dal file binario finale e salvati in un file separato.
- Quando ho un core dump, utilizzo GDB con l'eseguibile che ha creato il core e il file dei simboli. GDB non si lamenta mai che c'è una discrepanza tra il core/binario/simboli.
Eppure a volte ricevo core dump senza simboli! È comprensibile che io stia collegando la versione non di debug di libstdC++ e libgcc, ma sarebbe bello se almeno la traccia dello stack mi indicasse dove nel mio codice ha avuto origine la chiamata di istruzioni errata (anche se alla fine potrebbe finire in ??) .
Ciò è altamente probabile che sia il problema - se lo stack frame è stato distrutto dal bug, allora non c'è più. – caf
Voto verso l'alto. Se il bug sta cestinando lo stack, allora non c'è alcun sostituto per fallire presto e ad alta voce. assert() è tuo amico. – user47559