0xC00000FD(堆栈溢出)错误的参数是什么?
What are the parameters of the 0xC00000FD (Stack Overflow) error?
我创建了一个函数,用于在堆栈 (C++) 上分配一个太大的数组。 运行 结果出现此错误:
Unhandled exception at 0x000000013F4DEBF7 in xxx.exe: 0xC00000FD: Stack overflow (parameters: 0x0000000000000001, 0x0000000000043000).
我从未见过分配给堆栈溢出错误的特定实例的“参数”部分,而且我在 Internet 上的搜索没有任何结果。有谁知道这些参数是什么意思?我观察到,对于同一代码的多个 运行,第一个参数保持不变,第二个参数发生变化,但保持在 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
的参数,并说对于所有其他异常类型,参数数组具有未定义的内容。
注意这一点,记录的两种异常类型的参数之间存在一致性,并且堆栈溢出是通过访问冲突在内部检测到的,因此按照 [=17= 所述进行解码是有意义的].具体来说:
数组的第一个元素包含一个读写标志,指示导致访问冲突的操作类型。
- 如果此值为零,则线程试图读取不可访问的数据。
- 如果此值为 1,则线程试图写入不可访问的地址。
- 如果此值为 8,线程将导致用户模式数据执行保护 (DEP) 冲突。
第二个数组元素指定不可访问数据的虚拟地址。
与您捕获的异常信息相比,第一个元素是标志(非法读取/非法写入/NX 违规)是完全可信的。然而,第二个元素看起来不太像虚拟地址。也许对于 EXCEPTION_STACK_OVERFLOW
,它会相对于线程堆栈基地址进行报告。
我创建了一个函数,用于在堆栈 (C++) 上分配一个太大的数组。 运行 结果出现此错误:
Unhandled exception at 0x000000013F4DEBF7 in xxx.exe: 0xC00000FD: Stack overflow (parameters: 0x0000000000000001, 0x0000000000043000).
我从未见过分配给堆栈溢出错误的特定实例的“参数”部分,而且我在 Internet 上的搜索没有任何结果。有谁知道这些参数是什么意思?我观察到,对于同一代码的多个 运行,第一个参数保持不变,第二个参数发生变化,但保持在 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
的参数,并说对于所有其他异常类型,参数数组具有未定义的内容。
注意这一点,记录的两种异常类型的参数之间存在一致性,并且堆栈溢出是通过访问冲突在内部检测到的,因此按照 [=17= 所述进行解码是有意义的].具体来说:
数组的第一个元素包含一个读写标志,指示导致访问冲突的操作类型。
- 如果此值为零,则线程试图读取不可访问的数据。
- 如果此值为 1,则线程试图写入不可访问的地址。
- 如果此值为 8,线程将导致用户模式数据执行保护 (DEP) 冲突。
第二个数组元素指定不可访问数据的虚拟地址。
与您捕获的异常信息相比,第一个元素是标志(非法读取/非法写入/NX 违规)是完全可信的。然而,第二个元素看起来不太像虚拟地址。也许对于 EXCEPTION_STACK_OVERFLOW
,它会相对于线程堆栈基地址进行报告。