396 Star 1.4K Fork 1.3K

GVPopenEuler / kernel

 / 详情

4.19内在x86下生成的vmcore的函数调用堆栈layout和社区版本不一致

已完成
缺陷
创建于  
2022-06-23 19:08

在centos 7.6,3.10内核情况下,x86机器panic后,生成的堆栈,每个函数调用都有rbp指针保存,,如下

#9 [ffffa023f1ef3b80] page_fault at ffffffffb396b758
[exception RIP: xfs_buf_offset+56]
RIP: ffffffffc051f918 RSP: ffffa023f1ef3c38 RFLAGS: 00010246
RAX: 0000000000000000 RBX: 0000000000000000 RCX: 000000000000000b
RDX: 0000000000000000 RSI: 0000000000000000 RDI: ffffa007b08b0480
RBP: ffffa023f1ef3c68 R8: ffffa007b08b04f0 R9: 0000000000000000
R10: ffff9ffb4099f120 R11: ffffed29a7299080 R12: ffffa027fcb24000
R13: 0000000000000020 R14: ffffa007b08b0480 R15: 0000000000000000
ORIG_RAX: ffffffffffffffff CS: 0010 SS: 0018
#10 [ffffa023f1ef3c38] xfs_inode_buf_verify at ffffffffc0512e68 [xfs]
#11 [ffffa023f1ef3c70] xfs_inode_buf_write_verify at ffffffffc0512ee0 [xfs]
#12 [ffffa023f1ef3c80] _xfs_buf_ioapply at ffffffffc051d1b7 [xfs]
#13 [ffffa023f1ef3d30] xfs_buf_submit at ffffffffc051efcc [xfs]
#14 [ffffa023f1ef3d58] xfs_buf_delwri_submit_buffers at ffffffffc051f2a8 [xfs]
#15 [ffffa023f1ef3df8] xfs_buf_delwri_submit_nowait at ffffffffc05200c0 [xfs]
#16 [ffffa023f1ef3e08] xfsaild at ffffffffc054eebf [xfs]
#17 [ffffa023f1ef3ec8] kthread at ffffffffb32c1c71
#18 [ffffa023f1ef3f50] ret_from_fork_nospec_begin at ffffffffb3974c1d
crash>
crash>
crash>
crash>
crash> rd ffffa023f1ef3c38 50
ffffa023f1ef3c38: ffffffffc0512e68 0000000000000001 h.Q.............
ffffa023f1ef3c48: ffffa007b08b0480 ffffffffc051f2a8 ..........Q.....
ffffa023f1ef3c58: 0000000000000000 ffffa007b08b0480 ................
ffffa023f1ef3c68: ffffa023f1ef3c78 ffffffffc0512ee0 x<..#.....Q.....
ffffa023f1ef3c78: ffffa023f1ef3d28 ffffffffc051d1b7 (=..#.....Q.....
ffffa023f1ef3c88: ffffffffb32b7264 ffffa023f1ef3cc8 dr+......<..#...
ffffa023f1ef3c98: ffffffffb32b7ad2 0000000000000021 .z+.....!.......
ffffa023f1ef3ca8: ffffe3b8c11b1f00 ffffa014cd628818 ..........b.....
ffffa023f1ef3cb8: 0000000000001400 0000000000000002 ................
ffffa023f1ef3cc8: ffffa023f1ef3d10 ffffa014cd628780 .=..#.....b.....
ffffa023f1ef3cd8: ffffa023f1ef3d28 0000000000000000 (=..#...........
ffffa023f1ef3ce8: ffffa025beee5140 ffffffffb32d67f0 @Q..%....g-.....
ffffa023f1ef3cf8: 00000000ca741d5b ffffa007b08b04c8 [.t.............
ffffa023f1ef3d08: ffffa007b08b0480 ffffffffc051f2a8 ..........Q.....
ffffa023f1ef3d18: 0000000000000000 0000000000000000 ................
ffffa023f1ef3d28: ffffa023f1ef3d50 ffffffffc051efcc P=..#.....Q.....
ffffa023f1ef3d38: ffffa007b08b0480 ffffa007b08b04f0 ................
ffffa023f1ef3d48: ffffa007b58e2d00 ffffa023f1ef3df0 .-.......=..#...
ffffa023f1ef3d58: ffffffffc051f2a8 0000000000000282 ..Q.............
ffffa023f1ef3d68: ffffa02b36b078d8 ffffffffc05200c0 .x.6+.....R.....

但是在欧拉4.19内核上,panic后生成的堆栈,找不到rbp指针,导致不能推导堆栈内容:

--- ---
#5 [ffffc2854e6abd30] native_queued_spin_lock_slowpath at ffffffffb1d105a1
#6 [ffffc2854e6abd30] _raw_spin_lock at ffffffffb248ab5d
#7 [ffffc2854e6abd38] devkmsg_poll at ffffffffb1d1dbe6
#8 [ffffc2854e6abd48] ep_item_poll at ffffffffb1f1b41f
#9 [ffffc2854e6abd70] ep_send_events_proc at ffffffffb1f1b5fa
#10 [ffffc2854e6abdc8] ep_scan_ready_list.constprop.19 at ffffffffb1f1b24c
#11 [ffffc2854e6abe30] ep_poll at ffffffffb1f1bb3b
#12 [ffffc2854e6abef8] do_epoll_wait at ffffffffb1f1be2b
#13 [ffffc2854e6abf30] __x64_sys_epoll_wait at ffffffffb1f1be5a
#14 [ffffc2854e6abf38] do_syscall_64 at ffffffffb1c0435b
#15 [ffffc2854e6abf50] entry_SYSCALL_64_after_hwframe at ffffffffb2600088
RIP: 00007f06545fca37 RSP: 00007ffef19ce310 RFLAGS: 00000293
RAX: ffffffffffffffda RBX: 0000000000000008 RCX: 00007f06545fca37
RDX: 000000000000001f RSI: 00007ffef19ce350 RDI: 0000000000000008
RBP: 00007ffef19ce350 R8: 0000000000000000 R9: 000000000000001f
R10: 00000000ffffffff R11: 0000000000000293 R12: 000000000000001f
R13: 00000000ffffffff R14: 00007ffef19ce350 R15: 000055fef9c1bf50
ORIG_RAX: 00000000000000e8 CS: 0033 SS: 002b
crash> rd ffffc2854e6abd30 50
ffffc2854e6abd30: ffffffffb248ab5d ffffffffb1d1dbe6 ].H.............
ffffc2854e6abd40: ffffc2854e6abd80 ffffffffb1f1b41f ..jN............
ffffc2854e6abd50: 0000000100002000 ffff9d6c78132998 . .......).xl...
ffffc2854e6abd60: ffffc2854e6abde8 0000000000000000 ..jN............
ffffc2854e6abd70: ffffffffb1f1b5fa 000000007fff0000 ................
ffffc2854e6abd80: 0000000000000000 ffffc28500000019 ................
ffffc2854e6abd90: 9b3facfe29af4200 ffffffffb1f1b570 .B.)..?.p.......
ffffc2854e6abda0: ffff9d6c7b33be20 ffff9d6c7b33be50 .3{l...P.3{l...
ffffc2854e6abdb0: ffffc2854e6abde8 ffff9d6c7b33be00 ..jN......3{l...
ffffc2854e6abdc0: ffffc2854e6abe78 ffffffffb1f1b24c x.jN....L.......
ffffc2854e6abdd0: 0000000000000000 9b3facfe29af4200 .........B.)..?.
ffffc2854e6abde0: ffffc2854e6abf58 ffffc2854e6abde8 X.jN......jN....
ffffc2854e6abdf0: ffffc2854e6abde8 9b3facfe29af4200 ..jN.....B.)..?.
ffffc2854e6abe00: ffff9d6c7b33be20 ffffc2854e6abef0 .3{l.....jN....
ffffc2854e6abe10: ffff9d6c7b33be50 0000000000000000 P.3{l...........
ffffc2854e6abe20: 0000000000000000 ffff9d6c7b33be00 ..........3{l...
ffffc2854e6abe30: ffffffffb1f1bb3b ffff9d6c779fc020 ;....... ..wl...
ffffc2854e6abe40: 0000000000000fe0 0000000000000fe0 ................
ffffc2854e6abe50: ffffffff00000000 0000001f779fc000 ...........w....

评论 (7)

胡亚弟 创建了缺陷

Hi huyd12, welcome to the openEuler Community.
I'm the Bot here serving you. You can find the instructions on how to interact with me at Here.
If you have any questions, please contact the SIG: Kernel, and any of the maintainers: @YangYingliang , @pi3orama , @成坚 (CHENG Jian) , @jiaoff , @zhengzengkai , @Qiuuuuu , @刘勇强 , @Xie XiuQi

openeuler-ci-bot 添加了
 
sig/Kernel
标签
胡亚弟 修改了描述

欧拉4.19默认使用orc推栈,不会保存rbp的,如果需要rbp,可以开启CONFIG_UNWINDER_FRAME_POINTER推栈。3.10内核应该只支持fp推栈吧,所以函数调用时保存了rbp。我看日志4.19上也正常推出了栈内容,你说的问题是在那里呢

我的问题是没有rbp的话,䄦推出上一级的调用者在堆栈中的寄存器内容呢?
之前centos下,都是rbp保存在前面一级的函数堆栈中,这样能准确计算上一级函数的堆栈大小,起始地址,从而对应推导出rax,rbx等这些push入栈的寄存器,现在的这种情况下,如何推导呢?或者电话一下?

从调用栈的打印可以看到每层栈的sp:
#5 [ffffc2854e6abd30] native_queued_spin_lock_slowpath at ffffffffb1d105a1
[ffffc2854e6abd30]为这层栈帧的sp,根据sp和栈内容,结合反汇编可以推导栈上保存的寄存器内容,进行问题分析。

你好,我按照上周交流的内容,推到了一下堆栈内容,依然有一些以为:以:do_exit函数为例,有6次push指令
#5 [ffffbb57e38e7ce0] __khugepaged_exit at ffffffffaa0b007d
#6 [ffffbb57e38e7cf8] mmput at ffffffffa9eb10be
#7 [ffffbb57e38e7d10] do_exit at ffffffffa9eb9d0c
#8 [ffffbb57e38e7d88] do_group_exit at ffffffffa9eba66a

crash> dis -r ffffffffa9eb9d0c
0xffffffffa9eb99c0 <do_exit>: nopl 0x0(%rax,%rax,1) [FTRACE NOP]
0xffffffffa9eb99c5 <do_exit+5>: push %r15
0xffffffffa9eb99c7 <do_exit+7>: push %r14
0xffffffffa9eb99c9 <do_exit+9>: push %r13
0xffffffffa9eb99cb <do_exit+11>: push %r12
0xffffffffa9eb99cd <do_exit+13>: mov %rdi,%r12
0xffffffffa9eb99d0 <do_exit+16>: push %rbp
0xffffffffa9eb99d1 <do_exit+17>: push %rbx
0xffffffffa9eb99d2 <do_exit+18>: mov %gs:0x15c80,%rbx
0xffffffffa9eb99db <do_exit+27>: sub $0x40,%rsp
0xffffffffa9eb99df <do_exit+31>: mov %rbx,%rdi
0xffffffffa9eb99e2 <do_exit+34>: mov %gs:0x28,%rax

如果按照你给我的解释,用函数ip就可以推导每个函数堆栈内容,,如果不保存rbp寄存器,那对应的那条push、 rbp寄存器的指令的结果是什么?

ffffbb57e38e7ce0: ffffffffaa0b007d ffff92657a424800 }........HBze...
ffffbb57e38e7cf0: ffff9264454c67e0 ffffffffa9eb10be .gLEd...........
ffffbb57e38e7d00: ffff9264454c5c40 ffff9264454c67e0 @\LEd....gLEd...
ffffbb57e38e7d10: ffffffffa9eb9d0c 0400000000000080 ................

ffffbb57e38e7d20: 0000000027507378 12f382dea26a0c7c xsP'....|.j.....
ffffbb57e38e7d30: ffff92657e513560 00007fe615800000 `5Qe...........
ffffbb57e38e7d40: ffff9264416c0828 db75f4d302073200 (.lAd....2....u.
ffffbb57e38e7d50: db75f4d302073200 0000000000000009 .2....u.........
ffffbb57e38e7d60: ffff922700711f80 ffff9264454c5c40 ..q.'...@\LEd...
ffffbb57e38e7d70: 0000000000000000 ffffbb57e38e7e40 ........@
..W...
ffffbb57e38e7d80: 0000000000000009 ffffffffa9eba66a ...
.....j.......
方便的话,可以call一下

这里push rbp是因为后面需要把rbp作为一个寄存器来使用吧,使用前保存一下,使用完恢复。具体里面保存的值需要根据实际汇编。
比如函数A在调用B前使用了rbp寄存器保存一个临时变量,那么在函数B中如果也需要使用rbp寄存器,就需要先保存一下,不然回到A函数时临时变量的值被B修改了。
当不使用基于FP的推栈时,可以使用的寄存器相当于多了一个,可以将rbp作为通用寄存器来使用。

您好,由于这个issue两周内没有反馈解决情况,并且kernel已经给出分析结论,按照社区处理流程,先将issue关闭,后续有疑问可以重新开启。

sanglipeng 任务状态待办的 修改为已完成

登录 后才可以发表评论

状态
负责人
项目
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
预计工期 (小时)
参与者(4)
5329419 openeuler ci bot 1632792936
C
1
https://gitee.com/openeuler/kernel.git
git@gitee.com:openeuler/kernel.git
openeuler
kernel
kernel

搜索帮助