【続】CentOS7.5 の perf probe / perf record のバグと思われる挙動を調べ中

hiboma.hatenadiary.jp

上記のエントリを書いたのだが、VM を作り直したところ再現がとれなくなったので改めて検証しなおした.

(別のバグを調査した VM を使いまわしたのだが、パッケージインストール後にカーネルパニックを起こした影響かでパッケージ/ファイルの一部が欠損しまったらしい)

環境 / Environment

[vagrant@localhost ~]$ uname -a
Linux localhost.localdomain 3.10.0-862.3.3.el7.x86_64 #1 SMP Fri Jun 15 04:15:27 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

[vagrant@localhost ~]$ rpm -q perf
perf-3.10.0-862.3.3.el7.x86_64

[vagrant@localhost ~]$ rpm -q glibc
glibc-2.17-222.el7.x86_64

再現方法 / Steps to reproduce

perf probe で malloc を追加する

[root@localhost ~]# perf probe -x /usr/lib64/libc.so.6 malloc
Added new event:
  probe_libc:malloc    (on malloc in /usr/lib64/libc-2.17.so)

You can now use it in all perf tools, such as:

        perf record -e probe_libc:malloc -aR sleep 1
[root@localhost ~]# perf record -e probe_libc:malloc -aR sleep 1
perf: Segmentation fault
Segmentation fault

perf が Segmentation fault する.

dmesg

さらに dmesg のログで auditd, systemd-journal, systemd が Segmentation Fault を起こしているのが記録される

[   59.513170] auditd[561]: segfault at 1 ip 0000000000000001 sp 00007ffe31734398 error 14 in auditd[55bc73d03000+1c000]
[   59.513829] systemd-journal[430]: segfault at fbad8000 ip 00000000fbad8000 sp 00007ffc91cf2848 error 14 in systemd-journald[55ccc1a90000+50000]
[   59.527013] systemd[1]: segfault at 55ebfcd99cc0 ip 000055ebfcd99cc0 sp 00007ffc0a96a298 error 15

ここまでは確実に再現がとれるのを確認した

その他 / Additional Information

  • 3.10.0-862.el7.x86_64 より古いカーネルに切り替えると再現しない
  • malloc 以外のシンボルを指定すると再現しないケースもある.

perf を使わないで再現 / Steps to reproduce without perf

perf を使わずに下記の手順で uprobe_events をセットすると、systemd が segmentation fault してカーネルパニックを起こすのにも気がついた

$ sudo su - 
$ echo 'p:probe_libc/malloc /usr/lib64/libc-2.17.so:0x0000000000085800' > /sys/kernel/debug/tracing/uprobe_events
$ echo 1 > /sys/kernel/debug/tracing/events/probe_libc/malloc/enable 

採取したバックトレース

CentOS Linux 7 (Core)
Kernel 3.10.0-862.3.3.el7.x86_64 on an x86_64

localhost login: [   48.068563] systemd[1]: segfault at 7c ip 000000000000007c sp 00007ffcca763528 error 14[   48.068722] audit: netlink_unicast sending to audit_pid=558 returned error: -111
[   48.068725] audit: audit_pid=558 reset

[   48.106355] Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b
[   48.106355] 
[   48.139739] CPU: 2 PID: 1 Comm: systemd Not tainted 3.10.0-862.3.3.el7.x86_64 #1
[   48.142140] Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006
[   48.145962] Call Trace:
[   48.147063]  [<ffffffffaab0e78e>] dump_stack+0x19/0x1b
[   48.148992]  [<ffffffffaab08a90>] panic+0xe8/0x21f
[   48.150743]  [<ffffffffaa498206>] do_exit+0xa36/0xa40
[   48.152485]  [<ffffffffaa4a57b3>] ? __sigqueue_free.part.12+0x33/0x40
[   48.158405]  [<ffffffffaa49828f>] do_group_exit+0x3f/0xa0
[   48.163504]  [<ffffffffaa4a8b3e>] get_signal_to_deliver+0x1ce/0x5e0
[   48.165484]  [<ffffffffaa42a527>] do_signal+0x57/0x6e0
[   48.178887]  [<ffffffffaa63d9b4>] ? mntput+0x24/0x40
[   48.181192]  [<ffffffffaa4a77c6>] ? force_sig+0x16/0x20
[   48.189844]  [<ffffffffaa42aca4>] ? signal_fault+0x34/0xf0
[   48.193213]  [<ffffffffaa42ac22>] do_notify_resume+0x72/0xc0
[   48.199171]  [<ffffffffaab20b8f>] int_signal+0x12/0x17
[   48.213584] Kernel Offset: 0x29400000 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xffffffffbfffffff)

感想

  • Segmentation Fault が起きたら GDB を使うなりして原因や場所を絞り込んでいって直すものだと思うのだが、 perf probe + カーネルの何かの副作用なのでちょいと歯が立たない.
  • たぶんカーネルのバグだと思うのだが、どのパッチを原因としているのか分からん

バグレポートを出せるようにしよう