Malloc导致程序崩溃,在哪里寻找下一个线索?

时间:2014-02-10 02:44:01

标签: c++ visual-c++

我一直在试图调查一个非常奇怪的程序崩溃。堆栈跟踪基本上看起来像这样

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。

我还应该在哪里寻找原因的线索?

2 个答案:

答案 0 :(得分:1)

您应该使用GFlags和“Full Page Heap”运行代码!我假设,存在某种内存覆盖...

有关详细信息,请参阅:

您也可以使用Application Verifier查找其他问题......

答案 1 :(得分:1)

我的赌注是你的堆在那之前的电话中被冲洗了。如果你在malloc中失败了,这可能意味着C用于跟踪内存的内部结构被抬高了,这通常意味着你在某个地方覆盖了某些东西。或者删除了两次。或者某种组合。

考虑一下这个:

http://msdn.microsoft.com/en-us/library/974tc9t1.aspx