解释段错误消息

新手上路,请多包涵

以下段错误消息的正确解释是什么?

 segfault at 10 ip 00007f9bebcca90d sp 00007fffb62705f0 error 4 in libQtWebKit.so.4.5.2[7f9beb83a000+f6f000]
segfault at 10 ip 00007fa44d78890d sp 00007fff43f6b720 error 4 in libQtWebKit.so.4.5.2[7fa44d2f8000+f6f000]
segfault at 11 ip 00007f2b0022acee sp 00007fff368ea610 error 4 in libQtWebKit.so.4.5.2[7f2aff9f7000+f6f000]
segfault at 11 ip 00007f24b21adcee sp 00007fff7379ded0 error 4 in libQtWebKit.so.4.5.2[7f24b197a000+f6f000]

原文由 knorv 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 886
2 个回答

这是一个段错误,因为跟随一个空指针试图找到要运行的代码(即在指令获取期间)。

如果这是一个程序,而不是共享库

运行 addr2line -e yourSegfaultingProgram 00007f9bebcca90d (并重复给定的其他指令指针值)以查看错误发生的位置。更好的是,获得一个带有调试工具的构建,然后在 gdb 等调试器下重现问题。

因为它是一个共享库

不幸的是,你被水洗了;事后动态链接器无法知道库在内存中的位置。重现 gdb 下的问题。

错误是什么意思

以下是字段的细分:

  • address (在 at 之后)- 代码试图访问的内存位置(很可能 1011 是偏移量 969cfc0307从我们期望设置为有效值但指向 0 的指针

  • ip - 指令指针,即。尝试执行此操作的代码所在的位置

  • sp 堆栈指针

  • error - 页面错误的错误代码;请参阅下文了解这在 x86 上的含义( 链接)。

   /*
   * Page fault error code bits:
   *
   *   bit 0 ==    0: no page found       1: protection fault
   *   bit 1 ==    0: read access         1: write access
   *   bit 2 ==    0: kernel-mode access  1: user-mode access
   *   bit 3 ==                           1: use of reserved bit detected
   *   bit 4 ==                           1: fault was an instruction fetch
   *   bit 5 ==                           1: protection keys block access
   *   bit 15 ==                          1: SGX MMU page-fault
   */

原文由 Charles Duffy 发布,翻译遵循 CC BY-SA 4.0 许可协议

错误 4 表示“原因是用户模式读取导致找不到页面。”。 这里 有一个解码它的工具。

这是内核的定义。请记住,4 表示设置了位 2,并且没有设置其他位。如果你把它转换成二进制就很清楚了。

 /*
 * Page fault error code bits
 *      bit 0 == 0 means no page found, 1 means protection fault
 *      bit 1 == 0 means read, 1 means write
 *      bit 2 == 0 means kernel, 1 means user-mode
 *      bit 3 == 1 means use of reserved bit detected
 *      bit 4 == 1 means fault was an instruction fetch
 */
#define PF_PROT         (1<<0)
#define PF_WRITE        (1<<1)
#define PF_USER         (1<<2)
#define PF_RSVD         (1<<3)
#define PF_INSTR        (1<<4)

现在,“ip 00007f9bebcca90d”表示发生段错误时指令指针位于 0x00007f9bebcca90d。

“libQtWebKit.so.4.5.2[7f9beb83a000+f6f000]”告诉你:

  • 崩溃所在的对象:“libQtWebKit.so.4.5.2”
  • 该对象的基地址“7f9beb83a000”
  • 该对象有多大:“f6f000”

如果您获取基地址并从 ip 中减去它,您将获得该对象的偏移量:

 0x00007f9bebcca90d - 0x7f9beb83a000 = 0x49090D

然后你可以在它上面运行 addr2line:

 addr2line -e /usr/lib64/qt45/lib/libQtWebKit.so.4.5.2 -fCi 0x49090D
??
??:0

在我的情况下,它没有成功,要么我安装的副本与你的不一样,要么它被剥离了。

原文由 Tim 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题