首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >0xC00000FD (堆栈溢出)错误的参数是什么?

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

Stack Overflow用户
提问于 2021-09-30 15:18:25
回答 1查看 3.8K关注 0票数 2

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

代码语言:javascript
运行
复制
Unhandled exception at 0x000000013F4DEBF7 in xxx.exe: 0xC00000FD: Stack overflow (parameters: 0x0000000000000001, 0x0000000000043000).

我从未见过分配给堆栈溢出错误的特定实例的“参数”部分,而我在互联网上的搜索也没有结果。有人知道这些参数是什么意思吗?我观察到,对于同一代码的多次运行,第一个参数保持不变,第二个参数变化,但保持在6-5位数范围内。我很好奇他们的意思。

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

代码语言:javascript
运行
复制
constexpr uint8_t LOG_2_OF_BUCKET_COUNT = 20;

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-30 15:28:36

“参数”用the documentation for the EXCEPTION_RECORD structure描述。异常消息中的所有内容都来自EXCEPTION_RECORD,首先是ExceptionAddress,然后是从ExceptionAddress派生的模块名称,然后是ExceptionCode及其友好名称,最后是NumberParametersExceptionInformation[]读取。

不幸的是,就您的目的而言,正式文档只描述EXCEPTION_ACCESS_VIOLATIONEXCEPTION_IN_PAGE_ERROR的参数,并表示对于所有其他异常类型,参数数组具有未定义的内容。

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

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

代码语言:javascript
运行
复制
- If this value is zero, the thread attempted to read the inaccessible data.
- If this value is 1, the thread attempted to write to an inaccessible address.
- If this value is 8, the thread causes a user-mode data execution prevention (DEP) violation.

  • 第二个数组元素指定不可访问数据的虚拟地址。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69394803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档