我一直在试图调查一个非常奇怪的程序崩溃。堆栈跟踪基本上看起来像这样
msvcr100.dll!malloc(unsigned int size) Line 89 C
msvcr100.dll!operator new(unsigned int size) Line 59 C++
msvcp100.dll!std::num_put<char,std::ostreambuf_iterator<char,std::char_traits<char> > >::_Getcat(const std::locale::facet * * _Ppf, const std::locale * _Ploc) Line 1054 C++
msvcp100.dll!std::use_facet<std::num_put<char,std::ostreambuf_iterator<char,std::char_traits<char> > > >(const std::locale & _Loc) Line 518 C++
msvcp100.dll!std::basic_ostream<char,std::char_traits<char> >::operator<<(int) Line 287 C++
接下来会发生什么是我的代码中的一行,它只是一个简单的cout&lt;&lt;运算符以打印整数
cout << "Error is " << ret << endl;
我无法解决导致此次崩溃的原因。我知道我没有内存不足,因为这个过程在崩溃之前只使用了大约2000千字。
因为它只打印一个本地整数变量,所以我也看不到非法的内存访问。
使用带有Win32 Release配置文件的Visual Studio 2010(v100)编译程序,我已确认生产服务器已安装Microsoft Visual C ++ 2010 x86 Redistributable。
我还应该在哪里寻找原因的线索?
答案 0 :(得分:1)
您应该使用GFlags和“Full Page Heap”运行代码!我假设,存在某种内存覆盖...
有关详细信息,请参阅:
您也可以使用Application Verifier查找其他问题......
答案 1 :(得分:1)
我的赌注是你的堆在那之前的电话中被冲洗了。如果你在malloc中失败了,这可能意味着C用于跟踪内存的内部结构被抬高了,这通常意味着你在某个地方覆盖了某些东西。或者删除了两次。或者某种组合。
考虑一下这个: