- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在通过 void (*sa_sigaction)(int, siginfo_t *, void *);
安装的信号处理程序中,我如何判断 SIGILL 是来自非法指令还是来自某个已发送的进程信号?我查看了 siginfo_t 的 si_pid
,但这似乎是未初始化的,以防遇到非法指令,所以我不能根据它做出决定。 - 当然,我正在寻找一个最好的简单且可移植的解决方案,而不是阅读 si_addr
处的指令代码并尝试确定它是否合法。
最佳答案
真正的 SIGILL 将具有 ILL_ 值之一的 si_code
(例如,ILL_ILLADR)。用户请求的 SIGILL 将具有一个 SI_ 值(通常是 SI_USER)的 si_code
。
[Kernel-generated]
ILL_ILLOPC Illegal opcode.
ILL_ILLOPN Illegal operand.
ILL_ILLADR Illegal addressing mode.
ILL_ILLTRP Illegal trap.
ILL_PRVOPC Privileged opcode.
ILL_PRVREG Privileged register.
ILL_COPROC Coprocessor error.
ILL_BADSTK Internal stack error.
[User-requested]
SI_USER Signal sent by kill().
SI_QUEUE Signal sent by the sigqueue().
SI_TIMER Signal generated by expiration of a timer set by timer_settime().
SI_ASYNCIO Signal generated by completion of an asynchronous I/O request.
SI_MESGQ Signal generated by arrival of a message on an empty message queue.
例如,recipe in this question给我 ILL_ILLOPN,而 kill(1)
和 kill(2)
给我零 (SI_USER)。
当然,您的实现可能会向 POSIX 列表添加值。从历史上看,user- or process-generated si_code
values were <= 0 ,这仍然很常见。您的实现也可能有一个方便的宏来协助此处。例如,Linux 提供:
#define SI_FROMUSER(siptr) ((siptr)->si_code <= 0)
#define SI_FROMKERNEL(siptr) ((siptr)->si_code > 0)
关于linux - 我如何判断 SIGILL 是来自非法指令还是来自 kill -ILL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17367111/
当玩家四处走动时,我的服务器有时会崩溃。我尝试使用调试器运行它,服务器收到错误:程序收到信号 SIGILL,非法指令。 它显示 LogicHandler 中的第 59 行。这是函数运行。这是该函数:
我想使用 Sigil 将字体系列更改为嵌入式字体。我相信我已经在 CSS 中做好了一切。我在 Sigil 中导入了“1984”字体。 我已阅读本教程:http://www.pigsgourdsandw
我正在为我的安全类开发我的缓冲区溢出项目,我认为我已经正确设置了所有内容,但是当我运行它时我得到: Program received signal SIGILL, Illegal Instructio
我正在使用 NDK 和 GCC 将一些 C++ 代码移植到 Android。代码基本上运行。有一次,在 Eclipse 中调试时,调用 Dabbler::Android::Factory* pFact
在我学习 Elixir 的过程中,我正在尝试制作一个简单的符号来解析 csv。 我已经设法制作了一个印记来做到这一点,但是我找不到一种方法让它与特殊字符一起工作,例如 ; . defmodule Co
我的问题总结在标题中。当我调用方法 setHtml在 QtWebPageRenderer 的实例上,发出 SIGILL 信号,我的应用程序出现故障。 我知道这个问题是由糟糕的 Qt5 动态库引起的,但
这些都是有效的指令,直到 0x7fffffffdbe4 ,此时程序已经调用了退出系统调用。 gdb) x/20i $rip => 0x7fffffffdbb0: movabs rax,0x2
我有一个问题,我必须在两个战士之间的战斗中返回获胜者的名字。fighter类如下: class Fighter { private: std::string name; int health; int
我已经得到了答案,所以我只是发布这个,以防其他像我一样糟糕的编码员遇到这个问题。 (虽然有些黑魔法可能有人可以解释)。 我正在 Android 设备(Samsung Galaxy S7,尽管该问题很可
错误信号 4 SIGILL 对我来说是新的。当我查看墓碑文件并输入 int 他的地址时,我得到了 ??即 这是一些墓碑: *** *** *** *** *** *** *** *** *** ***
是否可以将枚举作为参数传递给可变参数函数?我正在尝试执行以下操作: GLenum ShaderManager::initialize() { GLuint program = loadShad
我正在尝试在 BeagleBone Black 上调试程序。在调试器之外,它会产生不正确的结果,但不会产生 SIGILL。它在调试器下也运行正常,没有断点。但是,它会在单步执行时生成带有断点设置的 S
我试图用动态生成的代码做一些讨厌的骇人听闻的事情,我希望操作系统在遇到未知操作码时向我发送一个 SIGILL。这会让我添加一层关于我的程序的元信息等等。 但是,对于我的小测试程序,操作系统似乎没有发送
我正在使用 Linux x86_64 机器来构建我的程序。我已将共享库链接到可执行文件。在我的项目中,我正在调用一个声明 vector 的函数函数内部。当该函数被调用时,我的程序被杀死。下面是通过GD
我正在尝试添加«€»作为«$»标量的别名,我认为使用俚语是这样做的。但是 perl6.doc 根本没有提到俚语。 我已阅读以下内容: https://perlgeek.de/en/article/mu
昨天,我发布了我的应用程序的新版本,今天我发现,很多从旧版本升级的用户都遇到了崩溃。 检查崩溃日志后,我仍然找不到问题所在,所以我来这里寻求帮助。 崩溃日志显示,未知线程崩溃,看起来应用程序尚未完成启
我收到以下代码的奇怪错误: #include #include #include inline static double myfma(double x,double y, double z)
我有一个 NDK 应用程序上市,并获得了关于 SIGILL 信号的 native 崩溃报告。 (我使用 google breakpad 生成 native 崩溃报告。)以下是详细信息: 我的应用是为
在我的应用程序中,我希望能够播放流式视频(通过 RTSP 协议(protocol))。我找到了开放的 RTSP 流:rtsp://red7blue.de/Primetime 并尝试播放它。但是我的应用
我编写了一个在 MIPS 32 位路由器上运行的小型 go 程序。我能够使用 go build 工具链在路由器上运行一个基本的 hello world 程序。 env GOOS=linux GOARC
我是一名优秀的程序员,十分优秀!