2010-06-22 81 views
2

我有一个巨大的MMC管理单元用Visual C++ 9编写。每隔一段时间,当我打开MMC中的F5 mmc.exe崩溃。如果我将一个调试器附加到它上面,我会看到以下消息:如何在Visual C++ 9中调试缓冲区溢出?

mmc.exe中发生缓冲区溢出,已损坏程序的内部状态。按Break键调试程序或继续终止程序。

有关更多详细信息,请参阅帮助主题“如何调试缓冲区溢出问题”。

首先,没有如何在任何地方调试Buffer Overrun Issues主题。

当我检查调用堆栈我看到它很可能一些与安全饼干用来防止堆栈分配的缓冲区溢出:

MySnapin.dll!__crt_debugger_hook() Unknown 
MySnapin.dll!__report_gsfailure() Line 315 + 0x7 bytes C 
mssvcr90d.dll!ValidateLocalCookies(void (unsigned int)* CookieCheckFunction=0x1014e2e3, _EH4_SCOPETABLE * ScopeTable=0x10493e48, char * FramePointer=0x0007ebf8) + 0x57 bytes C 
msvcr90d.dll!_except_handler4_common(unsigned int * CookiePointer=0x104bdcc8, void (unsigned int)* CookieCheckFunction=0x1014e2e3, _EXCEPTION_RECORD * ExceptionRecord=0x0007e764, _EXCEPTION_REGISTRATION_RECORD * EstablisherFrame=0x0007ebe8, _CONTEXT * ContextRecord=0x0007e780, void * DispatcherContext=0x0007e738) + 0x44 bytes C 
MySnapin.dll!_except_handler4(_EXCEPTION_RECORD * ExceptionRecord=0x0007e764, _EXCEPTION_REGISTRATION_RECORD * EstablisherFrame=0x0007ebe8, _CONTEXT * ContextRecord=0x0007e780, void * DispatcherContext=0x0007e738) + 0x24 bytes C 
ntdll.dll!7c9032a8()  
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll] 
ntdll.dll!7c90327a()  
ntdll.dll!7c92aa0f()  
ntdll.dll!7c90e48a()  
MySnapin.dll!IComponentImpl<CMySnapin>::GetDisplayInfo(_RESULTDATAITEM * pResultDataItem=0x0007edb0) Line 777 + 0x14 bytes C++ 
// more Win32 libraries functions follow 

我有很多的代码,也不知道哪里可能会出现缓冲区溢出为什么。我发现this forum discussion,特别是建议用更安全的版本(如wcscpy_s())替换所有类似wcscpy的功能。我遵循了建议,并没有让我更接近问题解决方案。

如何调试我的代码并查找Visual Studio 2008发生缓冲区溢出的原因和位置?

回答

1

我假设你无法可靠地重现这一点。

我已经成功地使用Rational Purify来搜索过去的各种内存问题,但它花费$,我不确定它将如何与MMC交互。

除非有某种内置内存调试器,否则您可能必须尝试以编程方式解决此问题。您是否可以删除/禁用功能块以查看问题是否表现出来?

如果您对发生问题的位置有“猜测”,则可以尝试禁用/更改该代码。即使您将复制功能更改为_s版本,仍然需要能够可靠地处理截断的数据。

2

我刚刚在一分钟前遇到了这个问题,而且我能够解决它。我首先在网上搜索无济于事,但我得到了这个线索。

反正,我运行VS2005,我有一个多线程程序。我不得不'猜测'哪个线程导致了问题,但幸运的是我只有几个。

所以,我所做的就是在那个线程中,我运行调试器,逐步完成高级函数的代码。我注意到它始终发生在函数中的相同位置,所以现在它是一个深入研究的问题。

我会做的另一件事是通过打开callstack窗口,确保堆栈看起来不错,只是注意堆栈何时出现故障。

我终于缩小到导致错误的那一行,但它实际上并不是那一行。这是它之前的路线。

那么,我的原因是什么?那么,简而言之,我试图将一个NULL指针memcpy写入一个有效的内存区域。

我很惊讶VS2005无法处理这个问题。

无论如何,希望有所帮助。祝你好运。

5

添加/RTCs切换到编译器。这将启用在运行时检测缓冲区溢出和溢出。当检测到溢出时,程序将在发生的地方准确地中断,而不是给予你死后的信息。

如果这没有帮助,那么调查wcscpy_s()你提到的调用。确认'元素数量'具有正确的值。我最近修复了缓冲区溢出导致wcscpy_s()的不正确使用。下面是一个示例:

const int offset = 10; 
wchar_t buff[MAXSIZE]; 
wcscpy_s(buff + offset, MAXSIZE, buff2); 

请注意,buff + offset具有MAXSIZE - 偏移量元素,而不是MAXSIZE。

+0

非常感谢指出/ RTC开关!为我节省了很多时间。 – Trass3r 2013-03-04 16:28:06

0

我有这个溢出,当我想在一个指针变量这样的递增值:

*out_BMask++;
代替
(*out_BMask)++;

如果你做了什么地方out_BMask被宣布为int *out_BMask
像我,然后我希望这会帮助你;)