一些C++应用程序编译和OS X Snow Leopard中无缝运行,但我最近改为OS X Lion中,在这里,虽然没有编译错误,当我尝试运行它,我得到的错误"非法指令:4",我不知道,可能是什么原因?
PS:
这些是我使用的链接标志
-Wl,-stack_size,0x10000000,-stack_addr,0xc0000000
Run Code Online (Sandbox Code Playgroud)
这是我得到的输出 sudo truss executable
setrlimit returned result = -1
SYSCALL(args) = return
getpid(0x0, 0x0, 0x0) = 32993 0
__sysctl(0xBFFFF5EC, 0x3, 0xBFFFF5E8) = 0 0
issetugid(0xBFFFF5EC, 0x3, 0xBFFFF5E8) = 0 0
csops(0x0, 0x0, 0xBFFFF65C) = 0 0
shared_region_check_np(0xBFFFD5E0, 0x0, 0xBFFFF65C) = 0 0
stat64("/usr/lib/dtrace/libdtrace_dyld.dylib\0", 0xBFFFE830, 0xBFFFF65C) = 0 0
open("/usr/lib/dtrace/libdtrace_dyld.dylib\0", 0x0, 0x0) = 3 0
pread(0x3, "\312\376\272\276\0", 0x1000, 0x0) = 4096 0
pread(0x3, "\316\372\355\376\a\0", 0x1000, 0x6000) = 4096 0
mmap(0x4D3000, 0x2000, 0x1, …Run Code Online (Sandbox Code Playgroud) 我想使用 CMake for Visual Studio 2019 设置 OpenCV。在调试我的程序时完成所有这些过程后,我收到此错误:
yaabolfazl.exe 中 0x00007FFCF1FF2382 (opencv_world412d.dll) 处未处理的异常:0xC000001D:非法指令。发生。
我认为这是由于我的处理器不支持 AVX (Windows 8.1, core i5 M520 2.4GHz) 引起的。(我是对的吗?)我发现我可以使用 CMake 制作一个新版本的 OpenCV,而无需使用CPU_DISPATCH和CPU_BASELINE选项来支持 AVX,但是当我更改它们的值时,我收到此错误:
配置过程出错,项目文件可能无效。
那么如何在没有 AVX 支持的情况下使用 CMake 构建 OpenCV(例如仅使用 SSE 支持)?
考虑以下故意导致双重恐慌的代码:
use scopeguard::defer; // 1.1.0
fn main() {
defer!{ panic!() };
defer!{ panic!() };
}
Run Code Online (Sandbox Code Playgroud)
我知道当Drop实现在从之前的恐慌中恢复时出现恐慌时,通常会发生这种情况,但为什么它会导致程序发出非法指令呢?听起来代码已损坏或意外跳转到某个地方。我认为这可能与系统或代码生成相关,但我在各种平台上进行了测试,它们都因相同的原因而发出类似的错误:
Linux:
use scopeguard::defer; // 1.1.0
fn main() {
defer!{ panic!() };
defer!{ panic!() };
}
Run Code Online (Sandbox Code Playgroud)
窗口(带有cargo run):
thread panicked while panicking. aborting.
Illegal instruction (core dumped)
Run Code Online (Sandbox Code Playgroud)
铁锈游乐场:
thread panicked while panicking. aborting.
error: process didn't exit successfully: `target\debug\tests.exe` (exit code: 0xc000001d, STATUS_ILLEGAL_INSTRUCTION)
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?这是什么原因造成的?
在 RISC-V 中故意提出非法指令的最简单、最易读和直接的方法是什么?
我知道根据规范,任何“全零”指令(因此 32/16 位只有零)都是“定义的非法指令”(第 12.5 节,用户规范)。但我不知道是否存在一个 asm 简写(至少我找不到任何),然后我可以在 C 代码中的内联 asm 中使用它。
肯定有一种可移植且可靠的方法总是会导致非法指令异常吗?我个人认为写入只读寄存器或类似的黑客行为非常令人反感,因为它们不是很明确。但也许这就是它的做法?
先感谢您
cat /proc/cpuinfo 报告已设置avx2标志.
但是,AVX2指令vpbroadcastb在运行时会导致非法指令异常.
我使用x86_64 Linux和nasm作为我的汇编程序.在我的系统上,重现这一点很简单
global main
main:
vpbroadcastb xmm1, eax
Run Code Online (Sandbox Code Playgroud)
使用NASM.
有人知道这是什么一回事吗?这是我正在使用的AMD A12-9700P RADEON R7 APU.
我刚刚使用该virtualenv方法的说明安装了 tensorflow 。安装过程很顺利,所以我认为那里没有任何问题。安装后,我继续尝试导入它以验证一切正常,我收到以下消息:
[1] 4492 illegal hardware instruction (core dumped) python
Run Code Online (Sandbox Code Playgroud)
这是在我使用 python 交互式控制台使用以下命令后发生的:
import tensorflow as tf
Run Code Online (Sandbox Code Playgroud)
我尝试使用带有 pip 的链接重新安装它,但没有成功。
我已经创建了 virtualenv:
python3.6 -m venv venv
Run Code Online (Sandbox Code Playgroud)
在这不起作用之后(因为它产生了相同的错误),我尝试了:
virtualenv --system-site-packages -p python3.6 venv
Run Code Online (Sandbox Code Playgroud)
我得到了同样的结果。
我用来安装 tensorflow 的命令是:
pip install tensorflow
Run Code Online (Sandbox Code Playgroud)
如您所见,我打算安装仅限 CPU 的版本。
我阅读了一些关于显示此消息的其他框架和技术的想法,因为硬件没有实现指令,因此除了获得新硬件之外,没有任何关系。
有没有办法解决这个问题?我已经尝试了一些不同的安装方法,但都没有看到工作
至于系统规格:
OS = Ubuntu 16.04 x64 LTS
Python = Python 3.6
pip version = 9.0.1
tensorflow version = TensorFlow 1.6.0
CPU = Intel Core 2 Quad Q6600 @2.40GHz
Run Code Online (Sandbox Code Playgroud)
OBS:我在这台机器上确实有一个 GPU,但我认为 tensorflow 不会在它上面运行,因为它有点旧。它是 Nvidia …
对于某些 Windows 7 用户,我有一个 C++ 应用程序在启动时崩溃。我无法在自己的机器上重现该错误,但使用 breakpad 生成了一个 .dmp 文件,这表明代码因初始化静态 std::vector 数组的“非法指令”而崩溃。这可能意味着什么?
例外:
Unhandled exception at 0x000000013F121362 (myApp.exe) in myApp.exe.4328.dmp: 0xC000001D:
Illegal Instruction.myApp.exe! dynamic initializer for Keyboard::key_freqs_() Line 11 C++
拆卸:
const std::vector<double> Keyboard::key_freqs_ = std::vector<double>({
**Crashed here->** 000000013F121362 vmovaps ymm0,ymmword ptr [__ymm@404059fbe76c8b44403ede353f7ced91403d228f5c28f5c3403b800000000000 (01408B7DE0h)]
000000013F12136A movzx r9d,byte ptr [rsp+20h]
000000013F121370 lea r8,[rbp+1F0h]
000000013F121377 vmovups ymmword ptr [rsp+30h],ymm0
000000013F12137D vmovaps ymm0,ymmword ptr [__ymm@404499fbe76c8b44404371eb851eb85240425a9fbe76c8b4404152f1a9fbe76d (01408B7E00h)]
000000013F121385 vmovups ymmword ptr [rsp+50h],ymm0
000000013F12138B vmovaps ymm0,ymmword ptr [__ymm@4049f4dd2f1a9fbe40487fdf3b645a1d40471fdf3b645a1d4045d3b645a1cac1 (01408B7E20h)]
000000013F121393 vmovups ymmword ptr [rsp+70h],ymm0
000000013F121399 …Run Code Online (Sandbox Code Playgroud) 这个程序与clang崩溃了
#include <iostream>
#include <string>
#include <mutex>
#include <functional>
int main(int argc, char **argv)
{
auto m = std::function<void()>( [](){
int r = std::rand() % 100;
if (r < 50)
{
return r; //should not return
}
});
for(int i=0;i<100;i++)
m();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
报告:
pt@test$ clang++ -o test test1.cpp -std=c++11
test1.cpp:14:5: warning: control may reach end of non-void lambda [-Wreturn-type]
});
^
1 warning generated.
pt@test$ ./test
Illegal instruction (core dumped)
Run Code Online (Sandbox Code Playgroud)
但是,它并没有崩溃g++.
我的困惑是,因为它会导致崩溃,为什么不在clang编译时将其视为错误?
更新
考虑以下代码 …
我正在编写一个 RISC-V 汇编程序,需要将一个字(保存到寄存器中)存储到一个 .data 段中:
.section .rodata
msg:
.string "Hello World\n"
.section .data
num:
.word 97
.section .text
.global _start
_start:
li a1, 100
sw a1, num
loop:
j loop
Run Code Online (Sandbox Code Playgroud)
但是当程序到达时,sw a1, num我收到错误“非法操作数`sw a1,num'”。如何将数据存储到 .data 段内的内存位置?你能给我一些提示吗?
下面是我写的 ac 程序的打印件,我运行它的演示,最后是关于我的编译器的一些信息。
? illegalInstructionDebug cat illegal.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void func(int* Z){
Z[-11] = acos(2);
}
int main(){
fflush(stdout);
printf("");
fflush(stdout);
int X[3];
int Z[3];
for (int n=0;0!=0;);
func(Z);
}
? illegalInstructionDebug gcc illegal.c; ./a.out
[1] 28836 illegal hardware instruction ./a.out
? illegalInstructionDebug clang --version
Apple clang version 11.0.3 (clang-1103.0.32.62)
Target: x86_64-apple-darwin19.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
? illegalInstructionDebug
Run Code Online (Sandbox Code Playgroud)
我在编写一个程序时遇到了一个非法指令错误,这是我以前从未见过的,所以我决定尝试找到一个最小的工作示例,以便我可以找出它与段错误或其他类型错误的区别。奇怪的是,程序中的微小更改似乎会使它返回段错误而不是非法指令错误。尽管如此,我还是设法将程序大幅缩减为一个较小的工作示例。话虽如此,对于一个最小的工作示例来说,该程序仍然相当大。
我的问题首先是为什么我会收到非法指令错误,其次是什么是非法指令错误。此外,如果此错误特定于我的机器,我也会感兴趣。这个程序有很多奇怪的属性。例如,似乎需要数字 -11 才能导致错误。