ChatGPT解决这个技术问题 Extra ChatGPT

解释段错误消息

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

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]

S
SergA

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

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

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

因为它是一个共享库

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

错误是什么意思

以下是字段的细分:

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

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

sp - 堆栈指针

error - 页面错误的错误代码;请参阅下文了解这在 x86 上的含义(链接)。 /* * 页面错误错误代码位: * * 位 0 == 0:未找到页面 1:保护错误 * 位 1 == 0:读访问 1:写访问 * 位 2 == 0:内核模式访问 1:用户模式访问 * 位 3 == 1:检测到使用保留位 * 位 4 == 1:错误是指令提取 * 位 5 == 1:保护密钥块访问 * 位 15 == 1:SGX MMU 页-过错 */


根据 stackoverflow.com/a/2179464/1100614error 不是 errno 的值,而是页面错误的特定于体系结构的错误代码。
是的,我也可以弄清楚 ip 和 sp 是什么意思,但是 at 后面的数字是什么意思???
@Nils,这就是它试图分页的地址。由于这里的地址太低,大概是应用于 NUL 指针的偏移量。
“不幸的是,你被淹没了;事后不可能知道动态链接器将库放在内存中的什么位置。” - 这是不正确的,基地址实际上打印在错误消息本身中(在这种情况下为 7f9beb83a000)。即使不是,由于基地址是页面对齐的,通常可以做出合理的有根据的猜测。
This link 有更多关于这些消息的信息。 this link 说明了如何启用/禁用这些消息
S
Scott Stensland

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

这是内核的定义。请记住,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

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


这个答案表明,在接受的答案中,评论“不幸的是,你被水洗了;不可能知道动态链接器事后将库放在内存中的位置”是错误的。段错误消息本身会告诉您发生段错误时共享库的基地址。
我只是在我自己的错误代码上使用了 -fCi 选项,并在一分钟内解决了这个错误。谢谢,很大的帮助。
对不起,你能澄清一下..例如在这种情况下? segfault at 7ffe44462000 ip 00007f4ee2211f0e sp 00007ffe44460168 error 6 in libc-2.26.so[7f4ee2093000+1d6000] ### 应该是:-fCi 0x17EF0E
这个答案是真金白银,瞬间发现了我的问题!
s
sendmoreinfo

让我们回到源头——2.6.32, for example。如果设置了 show_unhandled_signals sysctl,则该消息由 arch/x86/mm/fault.c 中的 show_signal_msg() 函数打印。

“错误”不是 errno 也不是信号编号,它是“页面错误错误代码”——参见 enum x86_pf_error_code 的定义。

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


“ip 的值应该适合这个区域。”我不清楚。这是否意味着:如果 ip 不适合该区域,则程序错误。或者:总是期望内核指定一个在这个区域内的地址(所以如果它在外面,内核中有一些可疑的东西)
是后者。也许更好的措辞是“期望 ip 的价值适合这个地区”。
M
Moustapha Kourouma

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

dmesg

Ex : [4970814.649014] upowerd[46459]: segfault at 8 ip 000055ce91269328 sp 00007fff71b98480 error 4 in upowerd[55ce91248000+39000] [4970840.152464] upowerd[46512]: segfault at 8 ip 000055c18f8e5328 sp 00007fffa63df280 error 4 in upowerd[55c18f8c4000+39000]

找到图书馆,在这里你有 upowerd

重新安装它,删除并安装 upowerd

dmesg

例如:通常,您会将其删除并在最后一行提及

[4970942.517131] upowerd [47466]:8 ip 处的段错误 00005637fd95b328 sp 00007ffeb77c3460 upowerd 中的错误 4(已删除)[5637fd93a000+39000]

此致,

穆斯塔法·库鲁马