FreeBSD の procstat と kgdb でカーネルコードを探る2021年05月05日 13時46分11秒

ZFS の問題を探っていた時の記録。

状況としては kldload zfs をするとシステムの一部の反応が無くなること。porcstat で kldload が何をしているかを点検。

# procstat -kk 1049
  PID    TID COMM                TDNAME              KSTACK                       
 1049 100215 kldload             -                   spa_init+0xc6
zfs_kmod_init+0x1a zfs_modevent+0x34 module_register_init+0x8c
linker_load_module+0xaab kern_kldload+0xc1
sys_kldload+0x50 syscall+0x17d g_ctx+0xe280bf29 
その後、kgdb で spa_init の 0xc6 を調べる。
# kgdb101 /boot/kernel/zfs.ko
Reading symbols from /boot/kernel/zfs.ko...
Reading symbols from /usr/lib/debug//boot/kernel/zfs.ko.debug...
(kgdb) info line *spa_init+0xc6
Line 2385 of "/usr/src/sys/contrib/openzfs/module/zfs/spa_misc.c"
   starts at address 0x1f7b66 <spa_init+198>
   and ends at 0x1f7b6b <spa_init+203>.
(kgdb) disass 0x1f7b66
Dump of assembler code for function spa_init:
   0x001f7aa0 <+0>:     push   %ebp
   0x001f7aa1 <+1>:     mov    %esp,%ebp
   0x001f7aa3 <+3>:     push   %esi
   0x001f7aa4 <+4>:     mov    0x8(%ebp),%esi
   0x001f7aa7 <+7>:     push   $0x45
   0x001f7aa9 <+9>:     push   $0xc754c
   0x001f7aae <+14>:    push   $0x3a5db4
   0x001f7ab3 <+19>:    call   0x1f7ab4 <spa_init+20>
...
   0x001f7b52 <+178>:   call   0x1c1910 <metaslab_stat_init>
   0x001f7b57 <+183>:   call   0x1641e0 <ddt_init>
   0x001f7b5c <+188>:   call   0x2596d0 <zio_init>
   0x001f7b61 <+193>:   call   0x16bb50 <dmu_init>
   0x001f7b66 <+198>:   call   0x2571e0 <zil_init>
   0x001f7b6b <+203>:   call   0x20a5b0 <vdev_cache_stat_init>
   0x001f7b70 <+208>:   call   0x217ab0 <vdev_mirror_stat_init>
   0x001f7b75 <+213>:   call   0x21ed70 <vdev_raidz_math_init>
0xc6 はオフセット。これは十進法で 198 になる。そこで、上記の zil_init が該当行になる。

前回