Windows 使用WinDbg调试0xc000001d异常

Windows 使用WinDbg调试0xc000001d异常,windows,exception,visual-studio-2015,windbg,illegal-instruction,Windows,Exception,Visual Studio 2015,Windbg,Illegal Instruction,我试图找到WinDbg出现“非法指令”异常(0xc000001d)的根本原因。 该项目是用VC++2015构建的。我从两次测试中得到了两次内存转储 目前,我发现以下两种转储都适用: 异常指向“movq mmword ptr[ecx],xmm0”指令 xmm0包含零 异常发生在对象构造函数中 地址在DS内 该地址属于看起来有效的堆条目 指向正在构造的对象的地址,因此它似乎试图将看起来也有效的obj.m_数据成员置零 我不知道该往哪里走,所以如果有任何指示,我将不胜感激 UPD: 。。。 mov

我试图找到WinDbg出现“非法指令”异常(0xc000001d)的根本原因。 该项目是用VC++2015构建的。我从两次测试中得到了两次内存转储

目前,我发现以下两种转储都适用:

  • 异常指向“
    movq mmword ptr[ecx],xmm0
    ”指令
  • xmm0包含零
  • 异常发生在对象构造函数中
  • 地址在DS内
  • 该地址属于看起来有效的堆条目
  • 指向正在构造的对象的地址,因此它似乎试图将看起来也有效的obj.m_数据成员置零
我不知道该往哪里走,所以如果有任何指示,我将不胜感激

UPD:

。。。
movq xmm0,mmword ptr[esi]
lea ecx,[edi+94h]

movq mmword ptr[ecx],xmm0 当操作系统处理来自CPU的故障(无法解码指令)时,将引发非法指令。如果CPU或操作系统不支持指令扩展,则可能发生这种情况。 . 在本例中,
msvc 2013
中的错误发生在CPU支持AVX,但操作系统不支持的情况下

出现故障的CPU似乎不支持SSE2,这可能是导致此问题的原因

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

我不知道AMD有一个工具,并且会对这样一个工具的工作持谨慎态度,因为它可能是缺少的操作系统支持

更新 如果操作系统不支持指令,为什么指令会失败?这方面的一个例子是AVX指令,它来自美国

AVX通过256位宽的YMM寄存器文件添加新的寄存器状态,因此需要明确的操作系统支持,以便在上下文开关之间正确保存和恢复AVX的扩展寄存器


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

这似乎不太可能,但@HarryJohnston是否有可能感谢您,我将对此进行检查。有没有办法知道生成了哪个CPU异常(使用windbg和内存转储)?您刚才说异常是0x1d。@conio,我认为CPU异常代码使用的数字与Windows异常代码的数字不同,例如,但Windows将其转换为0xC000001D。我不知道是否还有其他CPU异常代码也映射到0xC000001D,@HarryJohnston:所有这些都是合理的推断。有没有理由怀疑实际的异常是被零除或PF?我用一些asm行更新了这个问题。我想知道为什么上面的“movq xmm0,mmword ptr[esi]”指令2行没有导致异常。可能,可能没有。还没有证据。哪些命令有助于检查这一点?如何确定这种情况是否适用?指令扩展如何“不受操作系统支持”?这意味着什么?@conio,根据osdev.org维基:“由于此更改添加了新的寄存器,它在默认情况下被禁用,因为当时的典型操作系统还无法将这些寄存器保存在任务开关上。”也就是说,CPU不会运行某些指令,除非操作系统告诉它,“是的,我知道如何处理该功能,请继续并打开它。”
...
movq    xmm0,mmword ptr [esi]
lea     ecx,[edi+94h]
movq    mmword ptr [ecx],xmm0 ; << this causes the exception