c++ - 0xC00000FD(堆栈溢出)错误的参数是什么?

标签 c++ windows visual-c++ runtime-error stack-overflow

我创建了一个函数,它在堆栈上分配一个太大的数组(C++)。运行结果出现此错误:

Unhandled exception at 0x000000013F4DEBF7 in xxx.exe: 0xC00000FD: Stack overflow (parameters: 0x0000000000000001, 0x0000000000043000).

我从未见过分配给堆栈溢出错误的特定实例的“参数”部分,并且我在互联网上的搜索没有产生任何结果。有谁知道这些参数的含义吗?我观察到,对于同一代码的多次运行,第一个参数保持不变,第二个参数发生变化,但保持在 6-5 位数字范围内。我很好奇它们的含义。

如果重要的话,这里有一个 MRE:

constexpr uint8_t LOG_2_OF_BUCKET_COUNT = 20;

int main(){
    uint32_t histogram[1 << LOG_2_OF_BUCKET_COUNT];
    return 0;
}

最佳答案

“参数”在the documentation for the EXCEPTION_RECORD structure中描述。 。该异常消息中的所有内容均来自 EXCEPTION_RECORD ,第一个ExceptionAddress ,然后是从 ExceptionAddress 派生的模块名称,然后ExceptionCode及其友好名称,最后是 NumberParameters读取自 ExceptionInformation[] .

不幸的是,对于您的目的来说,官方文档仅描述了 EXCEPTION_ACCESS_VIOLATION 的参数和EXCEPTION_IN_PAGE_ERROR并表示对于所有其他异常类型,参数数组具有未定义的内容。

注意到这一点,记录的两种异常类型的参数之间存在一致性,并且堆栈溢出是通过访问冲突在内部检测到的,因此按照 EXCEPTION_ACCESS_VIOLATION 中的描述进行解码是有意义的。 。具体来说:

  • 数组的第一个元素包含一个读写标志,指示导致访问冲突的操作类型。

    • 如果该值为零,则线程尝试读取无法访问的数据。
    • 如果该值为 1,则线程尝试写入无法访问的地址。
    • 如果该值为 8,则该线程会导致用户模式数据执行保护 (DEP) 违规。
  • 第二个数组元素指定不可访问数据的虚拟地址。

与您捕获的异常信息相比,第一个元素是(非法读取/非法写入/NX 违规)的标志,这是完全可信的。然而,第二个元素看起来不太像虚拟地址。也许是为了EXCEPTION_STACK_OVERFLOW它是相对于线程堆栈基地址进行报告的。

关于c++ - 0xC00000FD(堆栈溢出)错误的参数是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69394803/

相关文章:

windows - Neo.ClientError.Procedure.ProcedureNotFound Neo4j Windows 桌面版

.net - 无法在 Windbg 中调试 .net 转储

c# - 使用某种类型的图表来可视化我的小型 C 程序的最佳方法是什么?

java - 游戏开发——制作 map

c++ - GDI 与 Direct2D

windows - LIBDBUS 菜单-GLIB-警告

c++ - 在 Visual C++ 中创建自定义性能计数器

visual-studio - “Call Stack” for Visual Studio 2005中的C++错误

c++ - Visual C++ 关心函数参数中的数组大小。那是对的吗?

c++ - WriteFile/ReadFile 死锁