如何解释linux内核陷阱错误行?

xyz*_*yzt 6 c linux debugging

我有一个用 C++ 编写的套接字应用程序,它在 Linux 上运行。今天早上它崩溃了,当我检查 /var/log/messages 时,我在崩溃时看到了以下行:

kernel: traps: LogProcessor[9364] general protection ip:4f2555 sp:7fbd529b1670 error:0 in MyPrg[400000+21a000]
Run Code Online (Sandbox Code Playgroud)

我想深入研究代码并找到原因,但我不知道如何解释错误行中的值。
这是否意味着错误是由 LogProcessor 引起的?“ip”、“sp”、“error:0”、MyPrg[400000+21a000] 的值是什么?

Tar*_*ran 5

这是一般保护故障。造成这种情况的原因有多种。您可以在上述链接中阅读更多内容。

  • LogProcessor[9364]- 线程名称和pid
  • ip:4f2555- 指令指针(这里看起来很可疑)
  • sp:7fbd529b1670- 堆栈指针
  • error:0- 错误代码(为什么是 0?)
  • MyPrg[400000+21a000]- 程序名称


Nab*_*zor 4

最有意义的信息是指令指针(IP)。您可以使用 GNU 工具检查您的二进制文件并检查发生了什么。例如使用 addr2line

addr2line -e <your binary> 0x4f2555 
Run Code Online (Sandbox Code Playgroud)

如果您的应用程序是使用调试符号 (-g) 构建的,并且代码(而不是库)中发生了错误,则输出应该向您显示问题。

SP是崩溃时的堆栈指针。MyPrg[400000+21a000] 告诉您二进制的虚拟地址。

error:0 表示除以零(如果您的应用程序在 x86 架构上运行): https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/x86/include /asm/traps.h#n148