使用WinDbg

时间:2017-05-28 20:21:54

标签: windows exception visual-studio-2015 windbg illegal-instruction

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

现在我发现以下两个转储都是如此:

  • 例外指向" movq mmword ptr [ecx], xmm0"指令
  • xmm0包含零
  • 异常发生在对象构造函数
  • 地址在DS
  • 该地址属于看似有效的堆条目
  • 正在构造对象的地址点,所以它似乎试图将零置于看起来有效的obj.m_data成员

我不知道该往哪里走,所以我很欣赏任何指示。

UPD:

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

更新

如果操作系统不支持指令,为什么指令失败?一个例子是AVX指令,来自wikipedia : AVX个状态。

  

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

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