gpt4 book ai didi

c++ - 如何调试 Visual C++ 9 中的缓冲区溢出?

转载 作者:太空狗 更新时间:2023-10-29 23:47:59 35 4
gpt4 key购买 nike

我有一个用 Visual C++ 9 编写的巨大 MMC 管理单元。每隔一段时间,当我在 MMC 中按 F5 键时,mmc.exe 就会崩溃。如果我将调试器附加到它,我会看到以下消息:

A buffer overrun has occurred in mmc.exe which has corrupted the program's internal state. Press Break to debug the program or Continue to terminate the program.

For more details please see Help topic 'How to debug Buffer Overrun Issues'.

首先,任何地方都没有如何调试缓冲区溢出问题主题。

当我检查调用堆栈时,我发现它可能带有用于防止堆栈分配的缓冲区溢出的安全 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

我有很多代码,但不知道缓冲区溢出可能发生的位置和原因。我找到了 this forum discussion特别是建议将所有类似 wcscpy 的函数替换为更安全的版本,如 wcscpy_s() .我听从了建议,但这并没有让我更接近问题的解决方案。

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

最佳答案

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

如果这没有帮助,请调查 wcscpy_s()你提到的电话。验证“元素数量”的值是否正确。我最近修复了缓冲区溢出导致错误使用 wcscpy_s() 的问题。这是一个例子:

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

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

关于c++ - 如何调试 Visual C++ 9 中的缓冲区溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3093535/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com