使用 WinDbg 调试 0xc000001d 异常
Debugging 0xc000001d exception with WinDbg
我正在尝试使用 WinDbg 查找 "Illegal instruction" 异常 (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
当操作系统处理来自 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 的情况下,额外的寄存器改变了为上下文切换存储的数据量。
我正在尝试使用 WinDbg 查找 "Illegal instruction" 异常 (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
当操作系统处理来自 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 的情况下,额外的寄存器改变了为上下文切换存储的数据量。