c ++ app崩溃在非AVX CPU上

时间:2016-04-20 09:35:18

标签: c++ debugging gcc avx

我有一个AVX优化的应用程序,我不需要与非AVX CPU兼容。但是,我想在这些较旧的CPU上显示一个干净的错误对话框,而不是让应用程序崩溃,因为这会导致客户混淆。

在我的main()我创建QApplication实例(我使用Qt框架),然后使用gcc __builtin_cpu_supports ("avx")测试AVX。如果失败,我会显示错误对话框。事实证明,这可以在一个简单的测试应用上使用非AVX CPU。

但是,我们的(大型)应用程序在非AVX CPU上显示对话框之前崩溃。

我怀疑:

  • 使用AVX内在函数的某处的全局变量初始化。我不是百分百肯定在任何地方都进行了检查,但似乎情况并非如此。
  • gcc优化器在检查前调用的某些代码上使用AVX指令。

问题是,我没有非AVX系统正在进行调试,如果可能,我宁愿避免购买。

  1. 在我的CPU上调试时是否可以禁用AVX,以便调试器在任何AVX指令上停止?
  2. 任何其他想法?

2 个答案:

答案 0 :(得分:1)

您可以创建一个(非优化的)包装器程序来执行功能测试,然后通过友好消息退出或执行您的应用程序。

允许QApplication构造函数修改传递的参数,因此您需要复制(或者不要在通过exec()的路径中使用任何Qt。)< / p>

像我这样的东西:

int main(int argc, char **argv)
{
    if (__builtin_cpu_supports ("avx")) {
        execv("/the/real/program", argv);
        perror("exec");
        exit 1;
    } else {
        QApplication app(argc, argv);
        QDialog d;
        d.show();
        return 1;
    }
}

答案 1 :(得分:0)

VMWare可以fake the CPUID来宾操作系统,您可以关闭所有AVX位。

但是,这只是骗应用程序:如果它仍然执行该AVX指令,它将不会导致应用程序进入调试器。