exe_common.inl 中的非法指令

Posted

技术标签:

【中文标题】exe_common.inl 中的非法指令【英文标题】:Illegal Instruction in exe_common.inl 【发布时间】:2017-05-04 08:28:20 【问题描述】:

这大约是我试图解决我的问题的一周,我真的需要帮助。我希望有人会发现我的设置有什么问题。

(我是法国人,所以对于任何英语错误,我深表歉意)

上下文

我有一个 Visual Studio 项目,它是从免费的开源库 OpenFace 开发的,下载地址为:https://github.com/TadasBaltrusaitis/OpenFace。 “开发自”是因为该项目只是使用了 OpenFace 的代码。我确切地说该项目不是我制作的,我从私人存储库中签出。

问题

我的项目构建了一个可执行文件但没有运行,在进入我的程序的入口点之前(cout

这是有罪的路线:

__scrt_current_native_startup_state = __scrt_native_startup_state::initialized;

此处是该断点处的堆栈跟踪:

CamFeaturesExtractor_Affich.exe!dlib::get_global_clock(void)
CamFeaturesExtractor_Affich.exe!00007ff63493114e()
ucrtbase.dll!_initterm()
CamFeaturesExtractor_Affich.exe!__scrt_common_main_seh() line 223
kernel32.dll!BaseThreadInitThunk()
ntdll.dll!RtlUserThreadStart()

这里是确切的消息异常:

Unhandled exception at 0x00007FF63499C5B7 in CamFeaturesExtractor_Affich.exe: 0xC000001D: Illegal Instruction.

我尝试了什么

将VS 2017改为2015 在 x64/x86 中构建调试/发布 在配置属性 > C/C++ > 代码生成中将增强指令集更改为 AVX、AVX2、SSE、SSE2、IA32、No Set... 禁用任何优化

这个问题不会出现在一些较新的计算机上(检查下面的规格)所以我的第一个猜测是说这是一个硬件问题。 Intel Cord Duo I5(与我的计算机型号相同)不会触发异常。这是我的规格:

Edition : Windows 10 Professionel
Version : 1511
OS Version : 10586.679
Processor : Intel(R) Celeron(R) CPU 2950M @ 2.00 GHz 2.00 GHz
RAM : 4G
System type : OS 64 bits, processeur x64

如果问题来自于我糟糕的处理器没有指令,是否有解决方法或者我需要更换我的电脑? 如果您需要一些我忘记提供的信息,请告诉我,如果您想帮助我,请提前感谢...

编辑

代码按要求停止的反汇编部分:

00007FF6D635B5BD  mov         eax,0FFh  
00007FF6D635B5C2  jmp         __scrt_common_main_seh+167h (07FF6D635B6B3h)  

            _initterm(__xc_a, __xc_z);
00007FF6D635B5C7  lea         rdx,[__xc_z (07FF6D639ED98h)]  
00007FF6D635B5CE  lea         rcx,[__xc_a (07FF6D639EC10h)]  
00007FF6D635B5D5  call        _initterm (07FF6D635C4B0h)  

            __scrt_current_native_startup_state = __scrt_native_startup_state::initialized;
00007FF6D635B5DA  mov         dword ptr [__scrt_current_native_startup_state (07FF6D64162E0h)],2  
        
        else
00007FF6D635B5E4  jmp         __scrt_common_main_seh+0A2h (07FF6D635B5EEh)  
        
            has_cctor = true;
00007FF6D635B5E6  mov         sil,1  
00007FF6D635B5E9  mov         byte ptr [has_cctor],sil  
        

        __scrt_release_startup_lock(is_nested);
00007FF6D635B5EE  mov         cl,bl  
00007FF6D635B5F0  call        __scrt_release_startup_lock (07FF6D635B368h) 

请注意,正如评论中所说,exe_common.inl 是一个只读 Visual Studio 文件,位于 C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\crt\src\vcruntime\exe_common.inl。如果你想看,我做了一个要点:https://gist.github.com/AlEmerich/281994ebbcde7d3bac88f21a85de96e2

最后编辑: 我不知道这是否是正确的做法,但我通过尝试更换我的电脑让观众知道我放弃了这个问题。我现在有一个更新的硬件,它会引发任何错误。无论如何感谢您的帮助!

【问题讨论】:

有罪的行具有 C++ 语法,来自 dlib,一个外部的非托管库。你很难在 C# 标签下解决这个问题。 "在文件 exe_common.inl 处被非法指令停止(不知道这个文件是什么)" 嗯,我不知道这个文件是什么,任何一个。我在the repository for the project you say you're using 中进行了搜索,它没有同名的文件。所以这个文件要么是你创建的,要么来自你正在使用但忘记提及的其他项目。这是非常重要的。为了调试它,我们需要查看此文件或查看反汇编。 Visual Studio 应该在违反非法指令后显示给你。 但是如果您正在构建目标 x86 并且您已将指令集更改为 IA32 (/arch:IA32),那么您应该正在生成需要现代处理器执行的任何指令。使用这些选项生成的代码将在与 386 一样旧的处理器上运行。所以要么您没有正确设置选项(也许您为错误的项目设置它们?),或者这个 exe_common.inl 文件正在使用内联汇编(或内在函数)以强制发出特定指令。同样,我们需要查看文件。 哦,我明白了。我没有意识到这是一个 CRT 文件。感谢您发布它。我没有看到任何关于这个文件的可疑之处。它当然没有使用任何内联汇编或强制任何可能在您的系统上无效的指令。您发布的反汇编中的所有内容看起来都非常安全(sil 寄存器除外,它只存在于 x64 中,但您说您有一个 64 位操作系统)。如果没有将minimal reproducible example 实际加载到调试器中,我很难追踪问题所在。 CRT 中似乎不太可能存在显示停止器错误,因此请返回并检查所有您的项目设置。 这与您的处理器或您从 CRT 源复制/粘贴的代码 sn-p 没有任何关系。此异常的最常见原因是修改了返回地址的堆栈损坏,导致程序跳转到任意地址。您为使用 C 或 C++ 库而付出的代价。一个小鸟告诉我你正在使用一个用 C++/CLI 编写的 Winforms 项目,这种场景在 VS2015 中变得非常脆弱。查看this post 以查看配置提示。 【参考方案1】:

对我来说,从发布模式中删除 _CRT_SECURE_NO_WARNINGS 并尝试在发布模式下构建。 它应该包含一些错误,修复它们应该没问题。

【讨论】:

以上是关于exe_common.inl 中的非法指令的主要内容,如果未能解决你的问题,请参考以下文章

mips debian中的mips固件:chroot非法指令

FAISS 搜索失败并出现模糊错误:“非法指令”或内核崩溃

启用 AVX2 的处理器上的非法指令 vgatherdps

由于用于构建 GCC 的 CPU 的体系结构,这是 g++ 的“非法指令错误”吗?

求解Runtime Error 中的sigtrap 是啥错误?

非法指令 gcc 汇编程序