在通过void (*sa_sigaction)(int, siginfo_t *, void *);
安装的信号处理程序中,如何判断SIGILL是源自非法指令还是发送SIGILL的某个进程?我查看了siginfo_t的si_pid
,但是如果遇到非法指令,这似乎是未初始化的,所以我不能根据它做出决定。 - 当然,我正在寻找一种最简单便携的解决方案,而不是阅读si_addr
的指令代码并试图确定它是否合法。如何判断SIGILL是源自非法指令还是kill -ILL?
3
A
回答
6
A 善意 SIGILL将具有其中一个ILL_值(例如,IL_ILLADR)的si_code
。用户请求的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)
相关问题
- 1. 如何判断指针是指向堆栈还是指向堆?
- 2. 如何判断库是COM还是DCOM?
- 3. 如何判断资源/实体是类还是实例
- 4. 如何判断fillStyle是否被指定为非法颜色?
- 5. 如何判断资源是否为空?
- 6. 如何判断源代码是使用Visual Basic还是VB.Net编写的?
- 7. 有没有办法判断类路径资源是文件还是目录?
- 8. 如何判断用户是新访客还是返回? analytics.js
- 9. 如何判断bonjour服务是无线还是蓝牙?
- 10. 如何判断我写的程序是32位还是64位?
- 11. 如何判断跳转是绝对还是相对?
- 12. 如何在PHP中判断它是数组还是散列?
- 13. 如何判断它是对象还是数组?
- 14. 如何判断obj是jquery还是普通javascript
- 15. 如何判断EntityObject的属性是主键还是外键?
- 16. 如何通过opencv判断轮廓是线还是曲线?
- 17. 如何判断交易是成功还是失败?
- 18. 如何判断我的对象的值是float还是int?
- 19. 如何判断SQL Server是本地还是远程?
- 20. 如何判断字符串在元值中是空还是空?
- 21. 如何判断DOM元素是HTML还是SVG?
- 22. 如何判断CmisObject是代表文件还是文件夹?
- 23. 如何判断鼠标是单击还是键盘按
- 24. 如何判断我的YEN符号是反斜杠还是YEN?
- 25. 如何判断javascript对象是图片还是画布?
- 26. 如何判断一个标签是网站还是图片?
- 27. 如何判断Android设备是手机还是手机?
- 28. 如何判断名词是人,地点还是事物?
- 29. 如何判断字符串是URL还是本地路径?
- 30. 如何判断它是碳还是可可?
为什么要这么做? – ctn
...为了找到一个Xenomai线程终止的原因,其中gdb表示“程序以信号4终止,非法指令”,但是在$ pc核心文件中有合法的分支指令。 –
Armali