解释分段错误消息

什么是正确的解释以下 Segfault 消息?

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]
170846 次浏览

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

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

运行 addr2line -e yourSegfaultingProgram 00007f9bebcca90d(并重复给定的其他指令指针值)查看错误发生的位置。更好的做法是,获得一个调试插装的构建,并在 gdb 这样的调试器下重现问题。

因为这是个共享图书馆

不幸的是,您已经被淘汰了; 不可能在事后通过动态链接器知道库在内存中的位置。在 gdb下重现问题。

错误是什么意思

下面是这些领域的分类:

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

  • ip-指令指针,即试图执行此操作的代码的位置

  • 堆栈指针

  • 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
    */
    

让我们回到源头—— 例如2.6.32。如果设置了 show _ unhandle _ Signals sysctl,则通过 arch/x86/mm/fault.c 中的 show _ information _ msg ()函数打印消息。

“ error”不是 errno 也不是信号号,而是“ page fault error code”——参见 enum x86 _ pf _ error _ code 的定义。

“[7fa44d2f8000 + f6f000]”是虚拟内存区域的起始地址和大小,该虚拟内存区域在崩溃时映射了有问题的对象。“ ip”的值应该适合这个区域。有了这些信息,应该很容易在 gdb 中找到有问题的代码。

Error 4 means "The cause was a user-mode read resulting in no page being found.". There's a tool that decodes it 给你.

这是内核的定义。请记住,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”意味着当 Segfault 发生时,指令指针位于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

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

您可以通过以下步骤修复它:

  • Dmesg

例如: [4970814.649014] 向上[46459] : Segfault at 8 ip 000055ce91269328 sp 00007fff71b98480 error 4 in 向上[55ce91248000 + 39000] [4970840.152464] 向上[46512] : Segfault at 8 ip 000055c18f8e5328 sp 00007fffa63df280 error 4 in 向上[55c18f8c4000 + 39000]

  • 找到图书馆,在这里你有 < strong > up

  • 重新安装,删除并安装 < strong > upowerd

  • Dmesg

例句: 通常情况下,你会在最后一行删除并提到它

[4970942.517131] upowerd [47466] : Segfault at 8 ip 00005637fd95b328 sp 00007ffeb77c3460 error 4 in upowerd (删除)[5637fd93a000 + 39000]

最好的问候,

Moustapha Kourouma