Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在visualc++;9? 我在Visual C++ 9中编写了一个巨大的MMC SnAPIN。偶尔当我在MMC.exe中按F5时,MMC.exe会崩溃。如果将调试器附加到它,我会看到以下消息:_C++_Visual Studio 2008_Debugging_Visual C++ - Fatal编程技术网

如何在visualc++;9? 我在Visual C++ 9中编写了一个巨大的MMC SnAPIN。偶尔当我在MMC.exe中按F5时,MMC.exe会崩溃。如果将调试器附加到它,我会看到以下消息:

如何在visualc++;9? 我在Visual C++ 9中编写了一个巨大的MMC SnAPIN。偶尔当我在MMC.exe中按F5时,MMC.exe会崩溃。如果将调试器附加到它,我会看到以下消息:,c++,visual-studio-2008,debugging,visual-c++,C++,Visual Studio 2008,Debugging,Visual C++,mmc.exe中发生缓冲区溢出,已损坏程序的内部状态。按“中断”调试程序,或按“继续”终止程序 有关更多详细信息,请参阅帮助主题“如何调试缓冲区溢出问题” 首先,这里没有关于如何调试缓冲区溢出问题的主题 当我检查调用堆栈时,我发现它可能带有用于防止堆栈分配缓冲区溢出的安全cookie: MySnapin.dll!__crt_debugger_hook() Unknown MySnapin.dll!__report_gsfailure() Line 315 + 0x7 bytes C mssv

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

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

首先,这里没有关于如何调试缓冲区溢出问题的主题

当我检查调用堆栈时,我发现它可能带有用于防止堆栈分配缓冲区溢出的安全cookie:

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
MySnapin.dll__crt_调试器_hook()未知
MySnapin.dll__报告失败()行315+0x7字节C
mssvcr90d.dll!ValidateLocalCookies(void(unsigned int)*CookieCheckFunction=0x1014e2e3,_EH4_SCOPETABLE*SCOPETABLE=0x10493e48,char*FramePointer=0x0007ebf8)+0x57字节C
msvcr90d.dll_除公共(无符号整数*CookiePointer=0x104bdcc8,无效(无符号整数)*CookieCheckFunction=0x1014e2e3,_EXCEPTION_RECORD*ExceptionRecord=0x0007e764,_EXCEPTION_REGISTRATION_RECORD*建立帧=0x0007ebe8,_CONTEXT*ContextRecord=0x0007e780,无效*DispatcherContext=0x0007e738)+0x44字节C
MySnapin.dll_除句柄4(异常记录*异常记录=0x0007e764,异常记录*注册记录*建立帧=0x0007ebe8,_上下文*上下文记录=0x0007e780,无效*DispatcherContext=0x0007e738)+0x24字节C
ntdll.dll!7c9032a8()
[下面的帧可能不正确和/或丢失,没有为ntdll.dll加载符号]
ntdll.dll!7c90327a()
ntdll.dll!7c92aa0f()
ntdll.dll!7c90e48a()
MySnapin.dll!ICOMPONEnTIMPL::GetDisplayInfo(Apple ToDaBeIt*PrimtDATAtIt= 0x007EDB0)行777 +0x14字节C++
//更多的Win32库函数随之而来
我有很多代码,不知道缓冲区溢出可能发生在哪里以及原因。我发现并特别建议将所有类似wcscpy的函数替换为更安全的版本,如。我听从了建议,但这并没有让我更接近问题的解决方案


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

我假设您无法可靠地再现这一点

在过去,我成功地使用RationalPurify来查找各种内存问题,但它的成本为美元,我不确定它将如何与MMC交互

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


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

我一分钟前刚刚遇到这个问题,并且我能够解决它。我先在网上搜索,没有结果,但我找到了这条线索

无论如何,我运行的是VS2005,我有一个多线程程序。我不得不“猜测”是哪个线程导致了问题,但幸运的是,我只有几个线程

因此,我所做的是在线程中运行调试器,在高级函数中逐步执行代码。我注意到它总是发生在函数中的同一个位置,所以现在这是一个向下钻取的问题

我要做的另一件事是打开callstack窗口,确保堆栈看起来正常,并注意堆栈何时失控

我最终缩小到了导致错误的那一行,但实际上不是那一行。这是它前面的那条线

那我的原因是什么?简言之,我试图将一个空指针memcpy到一个有效的内存区域

我很惊讶VS2005不能处理这个问题

不管怎样,希望这有帮助。祝你好运。

将开关添加到编译器中。这将允许在运行时检测缓冲区溢出和不足。当检测到超限时,程序将在发生超限的地方完全中断,而不是给你们验尸信息

如果这没有帮助,那么调查你提到的电话。验证“元素数”的值是否正确。我最近修复了因不正确使用wcscpy_()而导致的缓冲区溢出。以下是一个例子:

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

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

当我想在指针变量中增加一个值时,出现了这种溢出,如下所示:

*out_BMask++
相反
(*out\u BMask)+

其中out\u BMask被声明为
int*out\u BMask


如果你做了像我一样的事情,那么我希望这会对你有所帮助;)

非常感谢您指向该/RTC开关!节省了我很多时间。