2013-03-15 135 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

它很可能是你有全局/靜態變量,他們正試圖初始化之前你運行主。實際初始化的順序可能不是您所期望的,就好像您將它們放在不同的文件中一樣,也無法確定它們應以何種順序創建。

要麼刪除這些變量,要麼將它們排列在同一個文件中。