【问题标题】:Unhandled exception: 0x80000001: Not implemented. (VC++)未处理的异常:0x80000001:未实现。 (VC++)
【发布时间】:2010-01-19 04:46:28
【问题描述】:

我正在使用 MS Visual Studio 2005 (C++)..

谁能告诉我什么会导致像这样的运行时异常......?

yyy.exe 中 0x07ed0027 (xxx.dll) 处未处理的异常:0x80000001:未实现。

xxx.dll 是我正在处理的一个 dll,而 yyy.exe 是一个正在调用该 dll 的 exe。当调试时出现未处理的异常时,它会将我带到一个函数,但我看不到任何错误使用该函数(每次调用此函数时它都不会引发异常)。无论如何,我检查了函数中的所有值,它们似乎没问题。如果我单击继续而不是中断,或者在中断后按 F5,那么它会继续进行,就像什么都没发生一样。如果我没有提供,请告诉我足够的信息..

谢谢。

【问题讨论】:

    标签: c++ visual-c++ visual-studio-2005 exception


    【解决方案1】:

    与更熟悉的 0xC0000005 一样,0x80000001 是引发异常的代码。您可以在winnt.h 中查找它们。在这种情况下,我找到了#define STATUS_GUARD_PAGE_VIOLATION ((DWORD )0x80000001L)

    保护页面用于堆栈增长。栈顶之后的第一页被标记为保护页。当您写入时 - 通常通过在堆栈上推送更多数据 - 会发生保护页面异常。操作系统分配一个额外的页面或 RAM(或者可能是 2 个 - 留给操作系统的详细信息)并将保护页面上移。

    【讨论】:

    • 谢谢,很高兴知道这一点.. 如果我理解正确,是不是推送的数据超出了堆栈的容量..?在我的具体情况下,似乎不太可能,它在我将 void 指针强制转换为结构指针的行上中断,然后像这样检查: ... if (pToStruct->aStructMember==NULL) ... 我检查了这里的值,它们没问题...谢谢..
    • 这是另一种选择。另一种选择是由于错误而触摸保护页面。例如,如果pToStruct 指向堆栈,但堆栈上的对象实际上并不具有该类型,则 offsetof(aStructMember) 可能太大并导致读取未初始化的保护页。请注意,您通常不会看到保护页异常,但通常您从写入而不是读取开始。
    • 所以你的意思是,我将类型转换为结构指针的 void 指针对象可能指向一个不属于所述结构并且误读的对象?嗯..需要做更多的调查..
    • 我还不知道你正在投射void*。但是,是的,滥用演员表是一个常见的错误,并且肯定会导致这种情况。
    【解决方案2】:

    我认为异常过滤器可能会帮助您获取更多详细信息。

    使用SetUnhandledExceptionFilter 设置未处理的异常过滤器并检查究竟是哪里抛出了异常。

    【讨论】:

    • 我尝试使用它,但我似乎无法让它工作。我尝试了 SetUnhandledExceptionFilter(NULL);但什么都没有改变..如何制作函数过滤器?
    • 您需要编写一个函数并将函数名(函数指针)传递给SetUnhandledExceptionFilter。发生异常时控件会来到这个函数。
    猜你喜欢
    • 1970-01-01
    • 2020-04-23
    • 2017-12-12
    • 1970-01-01
    • 2023-01-28
    • 1970-01-01
    • 2011-11-19
    • 2022-12-21
    相关资源
    最近更新 更多