4

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

现在,我发现这两个转储都是正确的:

  • 异常指向“ movq mmword ptr [ecx], xmm0”指令
  • xmm0 包含零
  • 异常发生在对象构造函数中
  • 地址在 DS 内
  • 地址属于看起来有效的堆条目
  • 指向对象的地址正在被构造,所以它似乎试图将零赋给看起来也有效的 obj.m_data 成员

我不知道去哪里更远,所以我会很感激任何指示。

升级版:

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

1 回答 1

3

当操作系统处理来自 CPU 未能解码指令的故障时,会引发非法指令。如果 CPU 或操作系统不支持指令扩展,则会发生这种情况。 msdn:非法指令 AVX。在这种情况下,msvc 2013当 CPU 支持 AVX 但操作系统不支持时,就会出现错误。

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

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

我不知道 AMD 的工具,并且会警惕这种工具的工作,因为它可能是缺少操作系统支持。

更新

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

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

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

于 2017-05-29T10:45:41.727 回答