C++ c++;应用程序在非AVX CPU上崩溃
我有一个AVX优化的应用程序,我不需要使其与非AVX CPU兼容。但是,我希望在这些旧CPU上显示一个干净的错误对话框,而不是让应用程序崩溃,因为这会导致客户混淆 在我的C++ c++;应用程序在非AVX CPU上崩溃,c++,debugging,gcc,avx,C++,Debugging,Gcc,Avx,我有一个AVX优化的应用程序,我不需要使其与非AVX CPU兼容。但是,我希望在这些旧CPU上显示一个干净的错误对话框,而不是让应用程序崩溃,因为这会导致客户混淆 在我的main()。如果失败,我将显示一个错误对话框。这在一个简单的测试应用程序上被证明可以在非AVX CPU上工作 但是,在非AVX CPU上显示对话框之前,我们的(大型)应用程序会崩溃 我怀疑: 使用AVX内部函数的全局变量初始化。我不是百分之百肯定检查过所有地方,但似乎不是这样 gcc优化器在检查之前调用的某些代码上使用AVX
main()。如果失败,我将显示一个错误对话框。这在一个简单的测试应用程序上被证明可以在非AVX CPU上工作
但是,在非AVX CPU上显示对话框之前,我们的(大型)应用程序会崩溃
我怀疑:
- 使用AVX内部函数的全局变量初始化。我不是百分之百肯定检查过所有地方,但似乎不是这样
- gcc优化器在检查之前调用的某些代码上使用AVX指令
问题是,我并没有在调试工作的非AVX系统,我宁愿避免购买一个,如果可能的话
在我的CPU上调试时是否可以禁用AVX,以便调试器在任何AVX指令上停止
有其他的想法吗
您可以创建一个(非优化的)包装程序来执行功能测试,然后通过友好消息退出或执行应用程序
允许QApplication
构造函数修改传递的参数,因此您需要复制一个参数(或者在通过exec()
的路径中不使用任何Qt)
大概是(从我的头脑中):
VMWare可以支持来宾操作系统,您可以关闭所有AVX位
然而,这只是在欺骗应用程序:如果应用程序仍然执行AVX指令,它不会导致应用程序进入调试器。为什么不始终运行简单测试应用程序
,如果一切正常,那么简单测试应用程序
将运行主要复杂应用程序
?已在中讨论过。建议。你收到一个SIGILL
,你能为它安装一个处理程序吗?@Toby:我不知道,我该怎么做?使用MingWGCC。在非avx CPU上的gdb或任何其他调试器下运行你的应用程序,看看它在哪里死掉。做一个回溯,看看你是如何到达现在的位置的。你的两个猜测都很好,可能是其中之一。这并不能解决我的问题!我找不到有故障的AVX指令在哪里hidden@galinette这实际上会解决你的问题。AVX指令需要由操作系统启用才能使用。如果操作系统没有检测到CPU支持AVX指令,它将不会启用它们。这将禁用AVX检测,但如果我是对的,AVX指令仍然可以正常运行。这应该可以用一个小程序进行测试。我对这一特定情况了解不够,但一般来说,添加更多用户可访问寄存器的体系结构更改需要由您使用的任何操作系统显式启用:除非您知道这些寄存器将在上下文切换中保留,否则您不得将其公开给应用程序。当然值得一试。OTOH,如果AVX仅仅提供新的指令而不是额外的寄存器,那么成功的机会就不大了。@TobySpeight:事情不是这样的,没有x64指令“暴露寄存器”。如果没有硬件支持,在操作系统中伪造这样的“公开”将远远不够。此外,会得到什么?不使用额外寄存器的程序根本不受影响。使用额外寄存器的程序也不受影响;它还是跑不动。有条件地使用额外寄存器的程序必须检查CPUID,并且也不受影响。这里真正的edge案例是一个程序,它使用AVX寄存器,不检查它们,并且需要自定义错误。
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;
}
}