Windows上来自VS C ++的非法指令

问题描述 投票:0回答:1

我有一个C ++应用程序,对于某些Windows 7用户,它在启动时崩溃。我无法在自己的计算机上重现该错误,但是使用Breakpad生成了一个.dmp文件,该文件显示代码因初始化静态std :: vector数组的“非法指令”而崩溃。这可能意味着什么?

例外:Unhandled exception at 0x000000013F121362 (myApp.exe) in myApp.exe.4328.dmp: 0xC000001D:

Illegal Instruction.myApp.exe! dynamic initializer for Keyboard::key_freqs_() Line 11 C++

该行的来源:

const std::vector<double> Keyboard::key_freqs_ = std::vector<double>({
    27.5, 29.135, 30.868, 32.703, 34.648, 36.708, 38.89, 41.203, 43.654, 46.249, 48.999, 51.913,
    55, 58.271, 61.735, 65.406, 69.296, 73.416, 77.782, 82.407, 87.307, 92.499, 97.999, 103.82, 110,
    116.54, 123.47, 130.81, 138.59, 146.83, 155.56, 164.81, 174.61, 185, 196, 207.65, 220, 233.08,
    246.94, 261.63, 277.18, 293.66, 311.13, 329.63, 349.23, 369.99, 392, 415.3, 440, 466.16, 493.88,
    523.25, 554.37, 587.33, 622.25, 659.26, 698.46, 739.99, 783.99, 830.61, 880, 932.33, 987.77,
    1046.5, 1108.7, 1174.7, 1244.5, 1318.5, 1396.9, 1480, 1568, 1661.2, 1760, 1864.6, 1975.5, 2093,
    2217.5, 2349.3, 2489, 2637, 2793.8, 2959.9, 3136, 3322.4, 3520, 3729.3, 3951.1, 4186});

标题:

class Keyboard {
 public:
  static const std::vector<double> key_freqs_;
  ...
};

Dissasembly:

const std::vector<double> Keyboard::key_freqs_ = std::vector<double>({
**Crashed here->** 000000013F121362  vmovaps     ymm0,ymmword ptr [__ymm@404059fbe76c8b44403ede353f7ced91403d228f5c28f5c3403b800000000000 (01408B7DE0h)]  
000000013F12136A  movzx       r9d,byte ptr [rsp+20h]  
000000013F121370  lea         r8,[rbp+1F0h]  
000000013F121377  vmovups     ymmword ptr [rsp+30h],ymm0  
000000013F12137D  vmovaps     ymm0,ymmword ptr [__ymm@404499fbe76c8b44404371eb851eb85240425a9fbe76c8b4404152f1a9fbe76d (01408B7E00h)]  
000000013F121385  vmovups     ymmword ptr [rsp+50h],ymm0  
000000013F12138B  vmovaps     ymm0,ymmword ptr [__ymm@4049f4dd2f1a9fbe40487fdf3b645a1d40471fdf3b645a1d4045d3b645a1cac1 (01408B7E20h)]  
000000013F121393  vmovups     ymmword ptr [rsp+70h],ymm0  
000000013F121399  vmovaps     ymm0,ymmword ptr [__ymm@405059fbe76c8b44404ede147ae147ae404d22b020c49ba6404b800000000000 (01408B7E40h)]  
000000013F1213A1  vmovups     ymmword ptr [rbp-70h],ymm0  
000000013F1213A6  vmovaps     ymm0,ymmword ptr [__ymm@40549a0c49ba5e354053720c49ba5e3540525a9fbe76c8b4405152f1a9fbe76d (01408B7E60h)]  
000000013F1213AE  vmovups     ymmword ptr [rbp-50h],ymm0  
000000013F1213B3  vmovaps     ymm0,ymmword ptr [__ymm@4059f47ae147ae1440587fef9db22d0e40571fef9db22d0e4055d3a5e353f7cf (01408B7E80h)]  
000000013F1213BB  vmovups     ymmword ptr [rbp-30h],ymm0  
000000013F1213C0  vmovaps     ymm0,ymmword ptr [__ymm@406059eb851eb852405ede147ae147ae405d228f5c28f5c3405b800000000000 (01408B7EA0h)]  
000000013F1213C8  vmovups     ymmword ptr [rbp-10h],ymm0  
...

不确定这是否重要,但在最近的构建中,我开始直接在应用程序文件夹中分发Visual Studio运行时dll,而不是执行vc_redist.exe。

c++ assembly visual-c++ avx illegal-instruction
1个回答
6
投票

vmovupsAVX指令。从Sandy Bridge(2011年左右推出的Intel Core 2nd gen。)开始支持AVX。

在较旧的CPU上,指令将被捕获,并带有非法指令错误。

您应该在没有AVX支持的情况下重新编译您的应用程序和/或使用__cpuidcheck CPU功能,并在需要时将执行委派给“慢速”版本。


0
投票

感谢您的评论。我提供了一个库,该库建议使用/ arch:AVX编译标志,并且在未意识到无法在所有机器上使用的情况下使用了该标志。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.