陷阱无效操作码rip rsp

时间:2010-09-21 07:53:32

标签: c++

我们在/ var / log / messages中看到了一些以下提到的消息,用于我们的应用程序之一:

Sep 18 03:24:23 kernel:application_name [14682] trap invalid opcode rip:f6c6e3ce rsp:ffc366bc error:0 和 9月18日03:19:35内核:application_name [4434]一般保护rip:f6cd43a2 rsp:ffdfab0c错误:7b2

我无法确定这些输出的含义以及我们如何跟踪导致问题的功能/代码。什么是'陷阱无效操作码'和'一般保护'是什么意思?

2 个答案:

答案 0 :(得分:1)

通常这意味着程序的指令指针指向数据或垃圾。这通常是由写入杂散指针等引起的。

一种情况是您的代码(通过散列指针)在某个类的虚拟表上写入,用无意义替换成员函数地址。下次调用其中一个类的虚函数时,程序会将垃圾解释为地址并跳转到该地址。如果此地址处的任何数据碰巧不是处理器的有效机器代码指令,您将看到此错误。

答案 1 :(得分:1)

还有另一种可能导致'无效'操作码,即硬件不支持更新的操作码/指令集(SSE 4/5),或者它不是来自正确的制造商(AMD和英特尔都有一些特定的操作码)只能在他们的处理器上工作)或者只是没有权限来执行某些操作(虽然这可能会显示为其他操作)。

从上面我将把RIP作为'寄存器(?)指令指针'和RSP作为'寄存器堆栈指针',在这种情况下你可以使用调试器并在指定的地址上设置执行硬件断点(RIP)并追溯调用它的内容。(看起来你使用linux或unix,所以这很模糊)。如果你在Windows上,请尝试使用自定义异常过滤器捕获EXCEPTION_ILLEGAL_INSTRUCTION事件以获取更多信息