使用 WinDbg 调试 0xc000001d 异常

Debugging 0xc000001d exception with WinDbg

我正在尝试使用 WinDbg 查找 "Illegal instruction" 异常 (0xc000001d) 的根本原因。 该项目是用 VC++2015 构建的。我从两次测试运行中得到了两个内存转储。

现在我发现以下两个转储都是正确的:

我不知道要去哪里,所以我很感激任何方向。

更新:

...
movq    xmm0,mmword ptr [esi]
lea     ecx,[edi+94h]
movq    mmword ptr [ecx],xmm0 ; << this causes the exception

当操作系统处理来自 CPU 的错误时,会引发非法指令,因为它无法解码指令。如果 CPU 或操作系统不支持指令扩展,就会发生这种情况。 msdn : illegal instruction AVX。在这种情况下,msvc 2013 中的错误发生在 CPU 支持 AVX,但操作系统不支持时。

失败的 CPU 似乎不支持 SSE2,这可能是导致此问题的原因。

在我遇到 AVX 问题的情况下,当使用工具来确定是否使用了 AVX 时,有一个 CPU 测试确定该工具不支持 AVX(由 Intel 提供).

我不知道 AMD 有什么工具,我会对这样的工具保持警惕,因为它可能缺少操作系统支持。

更新

为什么操作系统不支持的指令会失败?这方面的一个例子是 AVX 指令,它来自 wikipedia : AVX 状态。

AVX adds new register-state through the 256-bit wide YMM register file, so explicit operating system support is required to properly save and restore AVX's expanded registers between context switches.

操作系统所需的工作或内存的任何更改可能需要明确选择加入。在 AVX 的情况下,额外的寄存器改变了为上下文切换存储的数据量。