上記のエントリを書いたのだが、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
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
+ カーネルの何かの副作用なのでちょいと歯が立たない. - たぶんカーネルのバグだと思うのだが、どのパッチを原因としているのか分からん
バグレポートを出せるようにしよう