在linux平台上,我的应用程序偶尔会因为信号4而得到内核转储。我发现信号4表示非法指令。所以我有一个问题:如何获取非法指令,以及什么可能导致信号4核心转储。
发布于 2011-12-19 14:18:31
一种更常见的可能性是使用未初始化或损坏的函数指针(或C++中的vtable )。
如果你的C代码调用一个损坏的函数指针,这个地址可能指向任何地方,包括一些数据,当处理器试图执行它时,它会给你一个SIGILL信号。
如果跳转到一个错误的地址,label as values和computed goto *x; (一个常用的C的GCC扩展)也可能发生这种情况。
如果您的调用堆栈损坏得足够严重,以至于覆盖了返回地址,则甚至可能发生这种情况。
很可能,使用gdb调试器(或者也可以使用valgrind)会对您有所帮助。
我的建议是总是初始化指针(例如,指向NULL),包括函数指针。IIRC,如果你调用NULL函数指针,你会得到一个SIGSEGV。
发布于 2011-12-19 10:15:26
您可能已经为不同的处理器型号编译了代码,或者您可能已经为不同的处理器型号安装了代码。在现代CPU中有大量令人印象深刻的SIMD指令来加速计算密集型任务(MMX、SSE、SSE2、SSSE3、SSE4.1、SSE4.2、3dNOW!(及其衍生物)、用于更快的系统调用的指令、用于更快的锁定处理的指令(popcnt)、用于计算AES轮次的指令等。
也许您的代码是在假定其中一些指令可用的情况下编译的,但是您的CPU不支持它们。
另一种可能是内存损坏或硬盘上的数据损坏。memtest86可以帮助您找到损坏的内存,您可以使用debsums或rpm -qV或类似的包管理器命令来检查您的程序是否仍然与它们第一次安装时的校验和匹配。
https://stackoverflow.com/questions/8556447
复制相似问题