c++应用程序在非AVX CPU上崩溃
c++ app crashing on non AVX CPUs
我有一个AVX优化的应用程序,不需要与非AVX CPU兼容。然而,我希望在这些旧的CPU上显示一个干净的错误对话框,而不是让应用程序崩溃,因为这会引起客户的困惑。
在我的main()
中,我创建了QApplication
实例(我使用的是Qt框架),然后使用gcc __builtin_cpu_supports ("avx")
测试AVX。如果失败,我会显示一个错误对话框。事实证明,在一个简单的测试应用程序上,这可以在非AVX CPU上工作。
但是,我们的(大型)应用程序在非AVX CPU上显示对话框之前会崩溃。
我怀疑:
- 使用AVX内部函数的全局变量初始化。我不能百分之百肯定到处都检查过,但事实似乎并非如此
- gcc优化器在检查之前调用的一些代码上使用AVX指令
问题是,我没有非AVX系统在工作中进行调试,如果可能的话,我宁愿避免购买。
- 在我的CPU上调试时,是否可以禁用AVX,以便调试器在任何AVX指令上停止
- 有其他想法吗
您可以创建一个(未优化的)包装程序来执行功能测试,然后带着友好的消息退出或执行您的应用程序。
QApplication
构造函数可以修改传递的参数,因此您需要获取一个副本(或者在通往exec()
的路径中不使用任何Qt)。
(从我的脑海中):
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;
}
}
VMWare可以伪造客户操作系统的CPUID,您可以关闭所有AVX位。
然而,这只是在欺骗应用程序:如果应用程序仍然执行AVX指令,它不会导致应用程序闯入调试器。
相关文章:
- 当回溯以零开始时,如何调试崩溃
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 内联映射初始化的动态atexit析构函数崩溃
- 执行函数时导致崩溃的变量
- 程序崩溃并显示"std::out_of_range"错误
- CoInitialize()在单独的线程上崩溃而不返回
- 使用调试/崩溃报告将应用程序部署到客户端
- 为什么所有C++编译器都会崩溃或挂起此代码
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 为什么我的多线程作业队列崩溃
- ExtractIconEx:可以工作,但偶尔会崩溃
- 为什么引用传递会导致此崩溃(C++)
- 试图创建流或fopen时程序崩溃
- 类对象数组的问题会导致崩溃
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 为什么要增加导致崩溃的指针
- 在虚幻引擎中删除NXOpen对象时崩溃
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- c++应用程序在非AVX CPU上崩溃
- 崩溃报告中的CPU寄存器地址在分析中如何有用