当前位置:  开发笔记 > 前端 > 正文

解释段错误消息

如何解决《解释段错误消息》经验,为你挑选了3个好方法。

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

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]

Charles Duff.. 87

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

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

运行addr2line -e yourSegfaultingProgram 00007f9bebcca90d(并重复给定的其他指令指针值)以查看错误发生的位置.更好的是,获得一个调试检测的构建,并在调试器(如gdb)下重现该问题.

因为它是一个共享库

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

这个错误意味着什么

这是字段的细分:

address(后at) -在内存中的位置的代码试图访问(很可能是1011是从一个指针偏移我们希望被设置为一个有效的值,但它不是指向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
 */

根据http://stackoverflow.com/a/2179464/1100614,`error`不是`errno`的值,而是页面错误的特定于体系结构的错误代码. (5认同)

很好的答案!谢谢! (2认同)

“不幸的是,您忙碌了;不可能事后知道动态链接程序将库放置在内存中的位置。” -这是不正确的,基址实际上是打印在错误消息本身中(在这种情况下为7f9beb83a000)。即使不是,因为基址是页面对齐的,通常也可以做出合理的猜测。 (2认同)


Tim.. 46

错误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"表示当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

在我的情况下,它没有成功,我安装的副本与你的副本不同,或者它被剥离.



1> Charles Duff..:

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

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

运行addr2line -e yourSegfaultingProgram 00007f9bebcca90d(并重复给定的其他指令指针值)以查看错误发生的位置.更好的是,获得一个调试检测的构建,并在调试器(如gdb)下重现该问题.

因为它是一个共享库

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

这个错误意味着什么

这是字段的细分:

address(后at) -在内存中的位置的代码试图访问(很可能是1011是从一个指针偏移我们希望被设置为一个有效的值,但它不是指向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
 */


根据http://stackoverflow.com/a/2179464/1100614,`error`不是`errno`的值,而是页面错误的特定于体系结构的错误代码.
很好的答案!谢谢!
“不幸的是,您忙碌了;不可能事后知道动态链接程序将库放置在内存中的位置。” -这是不正确的,基址实际上是打印在错误消息本身中(在这种情况下为7f9beb83a000)。即使不是,因为基址是页面对齐的,通常也可以做出合理的猜测。

2> Tim..:

错误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"表示当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

在我的情况下,它没有成功,我安装的副本与你的副本不同,或者它被剥离.


这个答案显示了评论"你被淹没了,不幸的是,在接受的答案中,动态链接器在事后"不可能知道库在内存中的位置是错误的.segfault消息本身会告诉您segfault发生时共享库的基址.

3> sendmoreinfo..:

我们来看看源码 - 例如2.6.32.如果设置了show_unhandled_signals sysctl,则由arch/x86/mm/fault.c中的show_signal_msg()函数打印该消息.

"error"不是errno也不是信号编号,它是"页面错误错误代码" - 请参阅enum x86_pf_error_code的定义.

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

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有