c++ 应用程序在非 AVX CPU 上崩溃

标签 c++ debugging gcc avx

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

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

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

我怀疑:

  • 在某处使用 AVX 内部函数进行全局变量初始化。我不是 100% 确定已检查所有地方,但似乎并非如此。
  • gcc 优化器在检查前调用的一些代码上使用 AVX 指令。

问题是,我没有用于调试的非 AVX 系统,我宁愿尽可能避免购买。

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

最佳答案

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

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

类似的东西(来 self 的脑海):

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;
    }
}

关于c++ 应用程序在非 AVX CPU 上崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36739633/

相关文章:

c++ - 获取 streambuf/stringbuf 数据的所有权

c# - 如何调试 WCF 程序

c++ - 是什么导致我的堆栈中出现神秘的重复条目?

c++ - "Include What you use"

c++ - GCC 产生隐藏的删除运算符调用,尽管构造函数被标记为 noexcept

c++ - 有人有用 C++ 包装函数的例子吗?

c++ - 2个类之间的双向关联

c++ - Qt:从文件中读取下一个字符时出错

c++ - 让 g++ 使用 SHLD/SHRD 指令

c++ - 调试优化代码的陷阱是什么?