2013-03-15 137 views
8

这是我的第一个问题就在这里计算器,所以我会尽量具体。我搜索了任何相关主题的论坛,但没有运气。无论如何这里去:之前堆栈溢出异常的main()

我正在使用Visual Studio 2005.我遇到了一个堆栈溢出异常:在IHR.exe 0x775715de未处理的异常:0xC00000FD:堆栈溢出。 ,当试图调试我的项目。调用堆栈无法在ntdll.dll中停止,甚至无法输入main()函数。

起初我怀疑这可能是一个编译设置的事情,但是当我送编译我的计算机到一个第二计算机可执行程序,它可以运行良好,它只是将不会在我的机器上运行。

同样的情况,相反,我编写的第二台计算机上的可执行文件,它可以运行于细。但是当我试图运行在我的计算机上的第二台计算机上编译的可执行文件时,它无法运行。所有出现的是一个空白的命令提示符和一个窗口消息说程序没有响应。

我使用的是Windows 7专业版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(常量无符号字符* S1 = 0x00fe8c10,常量无符号字符* S2 = 0x00fe8c10)线84 + 0xf字节
IHR.exe!_mbscmp(常量无符号字符* S1 = 0x00fe8c10,常量无符号字符* s2 = 0x00fe8c10)行84 + 0xf字节
IHR.exe!strcmp(const char * _s1 = 0x00fe8c10,const char * _s2 = 0x00fe8c10)行1646 + 0x2b字节
IHR.exe!_mbscmp_l(const unsigned char * 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) + 0xf字节
IHR.exe!STRCMP(为const char * _S1 = 0x00fe8c10,为const char * _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(INT _category = 0,为const char * _locale = 00000000)线826 + 0x1b字节
IHR.exe!的std :: _ Locinfo :: _ Locinfo_ctor(STD :: _ Locinfo * pLocinfo = 0x0018f8f8,常量char * locname = 0x00ea591c)192行+ 0x9字节
IHR.exe!的std :: _ Locinfo :: _ Locinfo(为const char * _Pch = 0x00ea591c)线78 + 0xd中的字节
IHR.exe!的std :: CTYPE :: CTYPE(常量短* _Table = 00000000,布尔_Deletetable = FALSE ,无符号整数_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 ::`dynamic initializer IHR.exe!_initit(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()+ 0×12字节
NTDLL.DLL!
RtlUserThreadStart @ 8()+ 0x27 bytes
ntdll.dll!
_RtlUserThreadStart @ 8()+ 0x1b字节

它不断重复调用的strcmp,mbscmp,mbscmp_l直到遇到一个堆栈溢出异常。

更新(2013年4月11日):我找到了导致问题的线路,但我仍然完全不知道为什么导致此问题。这是strcmp的用法。

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

当这个strcmp被注释掉了。该程序没有崩溃。处理这样一个问题的任何想法或经验?同样的程序在其他机器上仍能正常运行,但由于此线路只能在我的机器上崩溃。其他strcmp在整个程序中都没有问题。谢谢

+2

一个简单的“hello world”程序是否表现出相同的行为?不是,至少在某种程度上,这是关于你的代码的。 – 2013-03-15 06:45:02

+0

不可以,Hello World不会导致这个问题。如果这与我的代码有关,为什么它可以在具有相同操作系统的另一台计算机上运行? – mikevil14rin 2013-03-15 06:50:15

+0

后堆栈跟踪,它可能有帮助 – 2013-03-15 06:54:10

回答

2

它很可能是你有全局/静态变量,他们正试图初始化之前你运行主。实际初始化的顺序可能不是您所期望的,就好像您将它们放在不同的文件中一样,也无法确定它们应以何种顺序创建。

要么删除这些变量,要么将它们排列在同一个文件中。