8

这是我在stackoverflow上的第一个问题,所以我会尽量具体。我在论坛上搜索了任何相关主题,但没有运气。无论如何,这里是:

我正在使用 Visual Studio 2005。我遇到了堆栈溢出异常:IHR.exe 中 0x775715de 处的未处理异常:0xC00000FD:堆栈溢出。,在尝试调试我的项目时。调用堆栈没有帮助,因为它甚至在进入 main() 函数之前就停止在 ntdll.dll 处。

起初我怀疑这可能是编译设置的问题,但是当我将在我的计算机上编译的可执行文件发送到第二台计算机时,它可以正常运行,只是无法在我的计算机上运行。

反过来也是如此,我在第二台计算机上编译了可执行文件,它可以在上面运行良好。但是当我尝试在我的计算机上运行在第二台计算机上编译的可执行文件时,它无法运行。出现的只是一个空白的命令提示符和一条说明程序没有响应的 Windows 消息。

我正在使用 64 位的 Windows 7 Professional SP1。另一台计算机具有相同的操作系统版本。由于公司政策,我不能在这里发布任何源代码,但无论如何我认为它与源代码没有任何关系。我怀疑这可能是运行时环境中的问题。感谢任何帮助。谢谢。

这是调用堆栈上的所有内容:

->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 unsigned char * s1=0x00fe8c10, const unsigned char * s2=0x00fe8c10) 第 84 行 + 0xf 字节
IHR.exe!_mbscmp(const unsigned char * s1=0x00fe8c10, const unsigned char * 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) 第 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)  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) 第 826 行 + 0x1b 字节
IHR.exe!std::_Locinfo::_Locinfo_ctor(std::_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,直到遇到堆栈溢出异常。

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

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

当这个 strcmp 被注释掉时。程序没有崩溃。处理此类问题的任何想法或经验?相同的程序在其他机器上仍然可以正常运行,但由于这条线,只会在我的机器上崩溃。在整个程序中使用其他 strcmp 没有问题。谢谢

4

1 回答 1

2

您可能有全局/静态变量,并且它们正在尝试在您运行 main 之前进行初始化。可能实际初始化的顺序不是您所期望的,就像您将它们放在不同的文件中一样,没有办法告诉它们应该按什么顺序创建。

删除这些变量或将它们排列到同一个文件中。

于 2013-03-15T20:39:01.397 回答