3

对于我们的一个应用程序,我们在 /var/log/messages 中看到了下面提到的几条消息:

Sep 18 03:24:23 <machine_name> kernel: application_name[14682] trap invalid opcode rip:f6c6e3ce rsp:ffc366bc error:0
...
Sep 18 03:19:35 <machine_name> kernel: application_name[4434] general protection rip:f6cd43a2 rsp:ffdfab0c error:7b2

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

4

2 回答 2

2

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

从上面我会认为 RIP 是“注册(?)指令指针”,而 RSP 是“注册堆栈指针”,在这种情况下,您可以使用调试器并在指定地址(RIP)上设置执行硬件断点并跟踪返回调用它的内容。(您似乎使用的是 linux 或 unix,所以这很模糊)。如果您在 Windows 上,请尝试使用自定义异常过滤器来捕获EXCEPTION_ILLEGAL_INSTRUCTION事件以获取更多信息

于 2010-09-21T09:08:23.013 回答
2

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

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

于 2010-09-21T08:40:41.420 回答