2013-03-15 2 views
8

Это мой первый вопрос здесь, в stackoverflow, поэтому я постараюсь быть конкретным. Я искал форумы для любой связанной темы, но не повезло. В любом случае здесь идет:Исключение переполнения стека до main()

Я использую Visual Studio 2005. Я столкнулся с переполнением стека: Необработанное исключение в 0x775715de в IHR.exe: 0xC00000FD: переполнение стека. , при попытке отладить мой проект. Столб вызова не помогает, так как он останавливается на ntdll.dll, прежде чем даже ввести функцию main().

Сначала я подозревал, что это может быть настройка параметров компиляции, но когда я отправил исполняемый файл, скомпилированный на моем компьютере, на второй компьютер, он может работать нормально, он просто не будет работать на моей машине.

То же самое происходит в обратном порядке, я скомпилировал исполняемый файл на втором компьютере, он мог нормально работать. Но когда я попытался запустить исполняемый файл, который был скомпилирован на втором компьютере на моем компьютере, он не мог работать. Все, что появилось, - это пустая командная строка и сообщение о том, что программа не отвечает.

Я использую Windows 7 Professional SP1, 64 бит. Другой компьютер имеет ту же версию ОС. Из-за политики компании я не могу размещать здесь какой-либо исходный код, но в любом случае я не думаю, что это имеет какое-либо отношение к исходному коду. Я подозреваю, что это может быть проблемой в среде выполнения. Цените любую помощь. Благодарю.

Вот все, что находится в стеке вызовов:

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

Благодаря @ WhozCraig-й внушение, мне удалось получить более значимое сообщение в стеке вызовов. Тем не менее.

IHR.exe! _mbscmp (Const символ без знака * s1 = 0x00fe8c10, Const символ без знака * s2 = 0x00fe8c10) Строка 84 + 0xf байт
IHR.exe! _mbscmp (Const символ без знака * s1 = 0x00fe8c10, Const неподписанный символ * s2 = 0x00fe8c10) Строка 84 + 0xf байты
IHR.exe! зЬгстр (Const символа * _s1 = 0x00fe8c10, Const символ * _s2 = 0x00fe8c10) линия 1646 + 0x2b байты
IHR.exe! _mbscmp_l (Const символ без знака * s1 = 0x00fe8c10, const unsigned char * s2 = 0x00fe8c10, localeinfo_struct * plocinfo = 0x00000000) Строка 58 + 0xd байты
IHR.exe! _mbscmp (const unsigned char * s1 = 0x00fe8c10, const unsigned char * s2 = 0x00fe8c10) Строка 84 + 0xf байт
IHR.exe! зЬгстр (Const символ * _s1 = 0x00fe8c10, Const символ * _s2 = 0x00fe8c10) Линия 1646 + 0x2b байт

вот еще немного, приводя к стеку выше

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 (интермедиат _category = 0, Const символ * _locale = 0x00000000) линия 826 + 0x1b байт
IHR.exe! станд :: _ Locinfo :: _ Locinfo_ctor (станд :: _ Locinfo * pLocinfo = 0x0018f8f8, Const char * locname = 0x00ea591c) Строка 192 + 0x9 байт
IHR.exe! Std :: _ Locinfo :: _ Locinfo (const char * _Pch = 0x00ea591c) Строка 78 + 0xd байты
IHR.exe! Std :: ctype :: ctype (const short * _Table = 0x00000000, bool _Deletetable = false , unsigned int _Refs = 0) Строка 1740 + 0x10 байтов
IHR.exe! std :: ctype :: _ Getcat (const std :: locale :: facet * * _Ppf = 0x0018fbd8) Строка 1760 + 0x4d байтов IHR.exe! std :: use_facet> (const std :: locale & _Loc = {...}) Строка 478 + 0x9 байт IHR.exe!std :: basic_ios> :: widen (char _Byte = '') Строка 124 + 0x34 байта
IHR.exe! std :: basic_ios> :: init (std :: basic_streambuf> * _Strbuf = 0x00ff7908, bool _Isstd = false) Строка 135 + 0xa байты
IHR.exe! Std :: basic_ostream> :: basic_ostream> (std :: basic_streambuf> * _Strbuf = 0x00ff7908, bool _Isstd = false) Строка 53
IHR.exe! Std :: `динамический инициализатор для 'cout' '() Строка 13 + 0x16 байт IHR.exe! _initterm (void (void) * * pfbegin = 0x00e8d10c, void (void) * * pfend = 0x00e9dca0) Линия 855 IHR.exe! _cinit (int initFloatingPrecision = 1) Строка 293 + 0xf байты
IHR.exe! tmainCRTStartup() Строка 310 + 0x7 байт
IHR.exe! MainCRTStartup() Строка 196
kernel32.dll! @ BaseThreadInitThunk @ 12() + 0x12 байт
ntdll.dll!
RtlUserThreadStart @ 8() + 0x27 байт
ntdll.dll!
_RtlUserThreadStart @ 8() + 0x1b байт

Он продолжает неоднократно вызывая STRCMP, mbscmp, mbscmp_l, пока он не упрется исключение переполнения стека.

Обновление (11 апреля 2013 г.): Я нашел линию, которая вызывает проблему, но я все еще совершенно не знаю, почему она ее вызывает. Это использование strcmp.

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

Когда этот strcmp был закомментирован. Программа не сработала. Любые идеи или опыт работы с такой проблемой? Эта же программа все еще отлично работает на других машинах, но только сбой на моей машине из-за этой линии. другой strcmp используется во всей программе без проблем. Спасибо

+2

Простая программа «привет мир» проявляет такое же поведение? Это не так, это что-то вроде вашего кода, по крайней мере, до некоторой степени. –

+0

nope, Hello World не вызывает этой проблемы. Если это что-то связано с моим кодом, почему он может работать на другом компьютере с той же ОС? – mikevil14rin

+0

Post trace trace, может помочь –

ответ

2

Скорее всего, у вас есть глобальные/статические переменные, и они пытаются инициализировать перед запуском main. Вероятно, порядок фактической инициализации - это не то, что вы ожидаете, как если бы вы имели их в разных файлах, нет способа сказать, в каком порядке они должны быть созданы.

Либо удалите эти переменные, либо разместите их в одном файле.

Смежные вопросы