2013-03-15 12 views
8

questa è la mia prima domanda qui su StackOverflow quindi cercherò di essere specifico. Ho cercato nei forum qualsiasi argomento correlato ma senza fortuna. Comunque ecco qui:Eccezione di overflow dello stack prima di main()

Sto usando Visual Studio 2005. Ho riscontrato un'eccezione di overflow dello stack: Eccezione non gestita a 0x775715de in IHR.exe: 0xC00000FD: overflow dello stack. , quando si tenta di eseguire il debug del mio progetto. Lo stack di chiamate non aiuta poiché si ferma su ntdll.dll, prima ancora di entrare nella funzione main().

All'inizio sospettavo che potesse trattarsi di una cosa di impostazioni di compilazione, ma quando ho inviato l'eseguibile compilato sul mio computer a un secondo computer, poteva funzionare bene, semplicemente non funzionava sul mio computer.

Lo stesso accade al contrario, ho compilato l'eseguibile sul secondo computer, potrebbe funzionare bene. Ma quando ho provato a eseguire l'eseguibile che è stato compilato sul secondo computer del mio computer, non è stato possibile eseguirlo. Tutto ciò che è apparso era un prompt dei comandi vuoto e un messaggio di Windows che diceva che il programma non stava rispondendo.

Utilizzo Windows 7 Professional SP1, 64 bit. L'altro computer ha la stessa versione del sistema operativo. A causa della politica aziendale, non posso pubblicare alcun codice sorgente qui, ma comunque non penso che abbia nulla a che fare con il codice sorgente. Sospetto che potrebbe essere un problema nell'ambiente di runtime. Apprezzo qualsiasi aiuto. Grazie.

Ecco tutto quello che c'è sul stack di chiamate:

->ntdll.dll!775715de() 
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll] 
ntdll.dll!775715de()  
ntdll.dll!7756014e() 

Grazie al suggerimento di @ WhozCraig, sono riuscito a ottenere un messaggio più significativo sul stack di chiamate. Ancora perplesso però.

IHR.exe! _mbscmp (const char unsigned * s1 = 0x00fe8c10, const char * s2 = unsigned 0x00fe8c10) Linea 84 + 0xf byte
IHR.exe! _mbscmp (const char unsigned * s1 = 0x00fe8c10, const unsigned char * s2 = 0x00fe8c10) linea 84 + 0xf byte
IHR.exe! strcmp (const char * _s1 = 0x00fe8c10, const char * _s2 = 0x00fe8c10) linea 1646 + 0x2b byte
IHR.exe! _mbscmp_l (const char unsigned * s1 = 0x00fe8c10, const unsigned char * s2 = 0x00fe8c10, localeinfo_struct * plocinfo = 0x00000000) Riga 58 + 0xd byte
IHR.exe! _mbscmp (const unsigned char * s1 = 0x00fe8c10, const unsigned char * s2 = 0x00fe8c10) Riga 84 + 0xf byte
IHR.exe! strcmp (const char * _s1 = 0x00fe8c10, const char * _s2 = 0x00fe8c10) Linea 1646 + 0x2b byte

qui è ancora un po ', che porta fino alla pila sopra

IHR.exe!_mbscmp_l(const unsigned char * s1=0x00fe8c10, const unsigned char * s2=0x00fe8c10, localeinfo_struct * plocinfo=0x00000000) Line 58 + 0xd bytes C++ 
IHR.exe!_mbscmp(const unsigned char * s1=0x00fe8c10, const unsigned char * s2=0x00fe8c10) Line 84 + 0xf bytes C++ 
IHR.exe!strcmp(const char * _s1=0x00fe8c10, const char * _s2=0x00fe8c10) Line 1646 + 0x2b bytes  
IHR.exe!_setlocale_get_all(threadlocaleinfostruct * ploci=0x002f13a0) Line 1147 + 0x24 bytes 
IHR.exe!_setlocale_nolock(threadlocaleinfostruct * ploci=0x002f13a0, int _category=0, const char * _locale=0x00000000) Line 966 + 0x9 bytes C 

IHR.exe! setlocale (int _category = 0, const char * _locale = 0x00000000) linea 826 + 0x1b byte
IHR.exe! std :: _ Locinfo :: _ Locinfo_ctor (std :: _ * Locinfo pLocinfo = 0x0018f8f8, const char * locname = 0x00ea591c) Riga 192 + 0x9 byte
IHR.exe! Std :: _ Locinfo :: _ Locinfo (const char * _Pch = 0x00ea591c) Riga 78 + 0xd byte
IHR.exe! Std :: ctype :: ctype (const short * _Tabella = 0x00000000, bool _Deletetable = false , unsigned int _Refs = 0) Riga 1740 + 0x10 byte
IHR.exe! std :: ctype :: _ Getcat (const std :: locale :: facet * * _Ppf = 0x0018fbd8) Riga 1760 + 0x4d byte IHR.exe! std :: use_facet> (const std :: locale & _Loc = {...}) Riga 478 + 0x9 byte IHR.exe!std :: basic_ios> :: widen (char _Byte = '') Riga 124 + 0x34 byte
IHR.exe! std :: basic_ios> :: init (std :: basic_streambuf> * _Strbuf = 0x00ff7908, bool _Isstd = false) Riga 135 + 0xa byte
IHR.exe! Std :: basic_ostream> :: basic_ostream> (std :: basic_streambuf> * _Strbuf = 0x00ff7908, bool _Isstd = false) Riga 53
IHR.exe! Std :: `initializer dinamico per 'cout' '() Riga 13 + 0x16 byte IHR.exe! _initterm (void (void) * * pfbegin = 0x00e8d10c, void (void) * * pfend = 0x00e9dca0) Riga 855 IHR.exe! _cinit (int initFloatingPrecision = 1) Riga 293 + 0xf byte
IHR.exe! tmainCRTStartup() Linea 310 + 0x7 byte
IHR.exe! MainCRTStartup() Linea 196
kernel32.dll! @ BaseThreadInitThunk @ 12() + 0x12 byte
ntdll.dll!
RtlUserThreadStart @ 8() + 0x27 byte
ntdll.dll!
_RtlUserThreadStart @ 8() + 0x1b byte

Continua a volte chiamando strcmp, mbscmp, mbscmp_l fino a raggiungere un'eccezione di overflow dello stack.

Aggiornamento (11 aprile 2013): Ho trovato la linea che causa il problema, ma sono ancora totalmente all'oscuro sul perché lo sta causando. È l'uso di uno strcmp.

struct Foo 
{ 
    char text[4]; 
    bool operator < (const Foo &rhs) const 
{ 
    return strcmp(text, rhs.text) < 0; 
} 
} 

Quando questo strcmp è stato commentato. Il programma non si è bloccato. Qualche idea o esperienza nel trattare un simile problema? Lo stesso programma funziona ancora bene su altre macchine, ma si blocca solo sulla mia macchina a causa di questa linea. altro strcmp è usato in tutto il programma senza problemi. Grazie

+2

Un semplice programma "ciao mondo" mostra lo stesso comportamento? No, è qualcosa sul tuo codice, almeno in una certa misura. –

+0

no, Hello World non causa questo problema. Se ha qualcosa a che fare con il mio codice, perché può funzionare su un altro computer con lo stesso sistema operativo? – mikevil14rin

+0

traccia dello stack post, potrebbe essere d'aiuto –

risposta

2

È probabile che siano presenti variabili globali/statiche e che si stia tentando di inizializzare prima di eseguire main. Probabilmente l'ordine di inizializzazione effettiva non è quello che ti aspetti, come se li avessi in file diversi, non c'è modo di dire in quale ordine devono essere creati.

Rimuovere le variabili o organizzarle nello stesso file.

Problemi correlati