7 クラッシュ・ダンプの使用

この章では、システム・クラッシュの発生時にメモリー・イメージを作成するようにシステムを構成する方法と、crashデバッガを使用してクラッシュ・ダンプまたは稼働中システムのメモリー・イメージを分析する方法について説明します。

Kdumpについて

Kdumpは、Linuxカーネルのクラッシュ・ダンプ・メカニズムです。Kdump機能は有効にすることをお薦めします。システム・クラッシュが発生すると、Kdumpによって、クラッシュの原因を特定するために役立つメモリー・イメージ(vmcore)が作成されます。Kdumpを有効にする場合、Kdumpによる排他的な使用のためにシステム・メモリーの一部を予約する必要があります。このメモリーは、他の用途には使用できません。

Kdumpでは、システム・クラッシュのたびにkexecを使用してセカンド・カーネルをブートします。kexecは、ブート・ローダー・ステージの操作なしで、すでに実行中のカーネルのコンテキスト内からLinuxカーネルをブートできるようにする高速ブート・メカニズムです。

Kdumpの構成および使用

インストール中に、Kdumpを有効にするオプションを選択して、そのために予約するメモリー容量を指定できます。必要に応じて、この項で説明するとおり、後からkdumpを有効にできます。

使用中のシステムにkexec-toolsおよびsystem-config-kdumpパッケージがまだインストールされていない場合は、yumを使用してインストールします。

カーネル・ダンプ構成GUIを使用してKdumpを有効にするには、次の手順を実行します。
  1. 次のコマンドを入力します。

    sudo system-config-kdump

    カーネル・ダンプ構成GUIが起動します。Kdumpが現在無効の場合、緑色の有効化ボタンが選択可能となり、無効化ボタンはグレー表示されます。

  2. 有効化をクリックしてKdumpを有効にします。

  3. 次の設定タグを選択してKdumpの構成を調整できます。

    基本設定

    Kdumpのために予約するメモリーの容量を指定します。デフォルト設定は128MBです。

    ターゲット設定

    vmcoreダンプ・ファイルのターゲットの場所として、ローカルにアクセスできるファイル・システム、RAWディスク・デバイス、またはNFSやSSH over IPv4を使用したリモート・ディレクトリを指定します。デフォルトの場所は、/var/crashです。

    ダンプ・ファイルは、eCryptfsファイル・システム、rootfsファイル・システムにマウントされたNFSであるリモート・ディレクトリ、またはIPv6、SMB、CIFS、FCoE、ワイヤレスNIC、マルチパス・ストレージ、ソフトウェア・イニシエータを介したiSCSIを使用してアクセスする必要のあるリモート・ディレクトリには保存できません。

    フィルタ設定

    ダンプ・ファイルに含めるデータのタイプまたはダンプ・ファイルから除外するデータのタイプを指定します。オプションを選択するか選択を解除すると、Kdumpによってコア・コレクタ・プログラムmakedumpfile-dオプションに指定される引数の値が変更されます。

    エキスパート設定

    使用するカーネルの選択、カーネルとコア・コレクタ・プログラムに渡すコマンドライン・オプションの編集、ダンプに失敗した場合のデフォルト・アクションの選択、コア・コレクタ・プログラムmakedumpfileのオプションの変更を実行します。

    Unbreakable Enterprise Kernelでは、UEKリリース3 四半期更新1以降のcrashkernel=auto設定の使用をサポートします。crashkernel=auto設定を使用すると、dmesgコマンドの出力にcrashkernel=XM@0Mと表示されます(これは正常な状態です)。この設定では、物理メモリーのTBごとに128MBプラス64MBが実際に予約されます。

    ノート:

    XenまたはUEKリリース3 四半期更新1より前のUEKでは、crashkernel=autoを構成できません。crashkernel=128M@48Mなどの標準設定のみがサポートされています。128GBを超えるメモリーを搭載したシステムの場合、推奨設定はcrashkernel=512M@64Mです。

    ダンプに失敗した場合に備えて、5つのデフォルト・アクションのいずれかを選択できます。

    rootfsをマウントして/sbin/initを実行

    rootファイル・システムをマウントし、initを実行します。/etc/init.d/kdumpスクリプトによってダンプの/var/crashへの保存が試行されますが、これには、大量のメモリーが予約されている必要があります。

    reboot

    システムを再起動し、vmcoreは失われます。これはデフォルト・アクションです。

    shell

    コアを記録できるように、initramfs内部のシェル・セッションに入ります。システムを再起動するには、シェルを終了します。

    halt

    システムを停止します。

    poweroff

    システムの電源を切ります。

    これらの設定の詳細は、ヘルプをクリックしてください。

  4. 「適用」をクリックして変更を保存します。GUIに、変更を有効にするにはシステムを再起動する必要があるというポップアップ・メッセージが表示されます。

  5. OKをクリックしてポップアップ・メッセージを閉じます。

  6. 「File」→「Quit」を選択します。

  7. 適切な時点でシステムを再起動します。

Kdumpが使用するファイル

カーネル・ダンプ構成GUIによって次のファイルが変更されます。

ファイル 説明

/boot/grub2/grub.cfg

カーネル行にcrashkernelオプションを追加して、予約済メモリーの容量と任意のオフセット値を指定します。

/etc/kdump.conf

ダンプ・ファイルを書き込むことができる場所、makedumpfileコマンドのフィルタ・レベル、およびダンプに失敗した場合に実行するデフォルトの動作を設定します。サポートされるパラメータの詳細は、ファイル内のコメントを参照してください。

これらのファイルを編集した場合は、変更を反映するためにシステムを再起動する必要があります。

詳細は、kdump.conf(5)マニュアル・ページを参照してください。

 OCFS2でのKdumpの使用

デフォルトで、OCFS2クラスタのフェンシングされたノードは、クラスタにすぐに再結合できるようにパニックを起こすかわりに再起動されます。再起動の理由がわからない場合は、ノードがパニックを起こし、分析用のvmcoreを生成するようにノードの動作を変更できます。

次回フェンシングが発生したときにパニックを起こすようにノードを構成するには、クラスタの起動後にノードで次のコマンドを実行します。

sudo echo panic > /sys/kernel/config/cluster/cluster_name/fence_method

前のコマンドのcluster_nameは、クラスタの名前です。システムの各再起動後に値を設定するには、この行を/etc/rc.localに追加します。デフォルトの動作に戻すには、fence_methodの値をpanicではなくresetに設定し、/etc/rc.localから行を削除します。

詳細は、『Oracle Linux 7: ファイル・システムの管理』の「Oracle Cluster File Systemバージョン2」の章を参照してください。

crashデバッガの使用

crashコマンドを使用すると、Oracle Linuxシステムの実行中にシステムの状態を分析できます。また、カーネル・クラッシュによって生じたコア・ダンプの状態を分析することもできます。crashは、GNUデバッガのgdbとマージすることでソース・コードのデバッグ機能を提供します。

crashパッケージのインストール

crashコマンドを使用するには、crashパッケージと適切なdebuginfodebuginfo-commonパッケージをインストールする必要があります。

必要なパッケージをインストールするには:

  1. 最新バージョンのcrashパッケージをインストールします。

    sudo yum install crash
  2. 調査するvmcoreまたはカーネル用の適切なdebuginfoおよびdebuginfo-commonパッケージをhttps://oss.oracle.com/ol7/debuginfo/からダウンロードします。

    • システムで実行中のUnbreakable Enterprise Kernelを調査する場合は、次に示すようなコマンドを使用してパッケージをダウンロードします。

      sudo export DLP="https://oss.oracle.com/ol7/debuginfo"
      sudo wget ${DLP}/kernel-uek-debuginfo-`uname -r`.rpm
      sudo wget ${DLP}/kernel-uek-debuginfo-common-`uname -r`.rpm
    • システムで実行中のRed Hat Compatible Kernel (RHCK)を調査する場合は、次に示すようなコマンドを使用してパッケージをダウンロードします。

      sudo export DLP="https://oss.oracle.com/ol7/debuginfo"
      sudo wget ${DLP}/kernel-debuginfo-`uname -r`.rpm
      sudo wget ${DLP}/kernel-debuginfo-common-`uname -r`.rpm
    • 現在実行中のカーネルとは別のカーネルに関連するvmcoreファイルを調査する場合は、vmcoreを生成するカーネルに適したdebuginfoおよびdebuginfo-commonパッケージをダウンロードします。次に例を示します。

      sudo export DLP="https://oss.oracle.com/ol7/debuginfo"
      sudo wget ${DLP}/kernel-uek-debuginfo-4.1.12-112.14.15.el7uek.x86_64.rpm
      sudo wget ${DLP}/kernel-uek-debuginfo-common-4.1.12-112.14.15.el7uek.x86_64.rpm

      ノート:

      vmcoreファイルがKdumpで生成された場合は、次のコマンドを使用することでバージョンを確認できます。

      sudo crash --osrelease /var/tmp/vmcore/2013-0211-2358.45-host03.28.core
      2.6.39-200.24.1.el6uek.x86_64
  3. debuginfoおよびdebuginfo-commonパッケージをインストールします。

    sudo rpm -Uhv kernel-uek-debuginfo-4.1.12-112.14.15.el7uek.x86_64.rpm \
      kernel-uek-debuginfo-common-4.1.12-112.14.15.el7uek.x86_64.rpm

    crashコマンドに必要なvmlinuxカーネル・オブジェクト・ファイル(名前リスト・ファイルとも呼びます)は、/usr/lib/debug/lib/modules/kernel_version/にインストールされます。

crashの実行

注意:

稼働中システムでcrashコマンドを実行すると、データ破損や全体的なシステム障害を引き起こす可能性があります。このコマンドは、Oracle Supportに指示された場合を除き、本番システムの調査に使用しないでください。

現在実行中のカーネルを調査するには、次のコマンドを実行します。

sudo crash

vmcoreファイルを生成したカーネルのバージョンを確認するには:

sudo crash --osrelease /var/tmp/vmcore/2013-0211-2358.45-host03.28.core
2.6.39-200.24.1.el6uek.x86_64

vmcoreファイルを調査するには、ファイルへのパスを引数として指定します。たとえば:

sudo crash /var/tmp/vmcore/2013-0211-2358.45-host03.28.core

ノート:

適切なvmlinuxファイルが/usr/lib/debug/lib/modules/kernel_version/に存在している必要があります。

別の場所にvmlinuxファイルがある場合、コマンドでは、そのパスを最初に指定して、vmcoreファイルへのパスを続けて指定する必要があります。次に例を示します。

sudo crash /var/tmp/namelist/vmlinux-host03.28 /var/tmp/vmcore/2013-0211-2358.45-host03.28.core

たとえば、次のcrash出力は、システム・パニック後にダンプされたvmcoreファイルからのものです。

      KERNEL: /usr/lib/debug/lib/modules/2.6.39-200.24.1.el6uek.x86_64/vmlinux
    DUMPFILE: /var/tmp/vmcore/2013-0211-2358.45-host03.28.core
        CPUS: 2
        DATE: Fri Feb 11 16:55:41 2013
      UPTIME: 04:24;54
LOAD AVERAGE: 0.00, 0.01, 0.05
       TASKS: 84
    NODENAME: host03.mydom.com
     RELEASE: 2.6.39-200.24.1.el6uek.x86_64
     VERSION: #1 SMP Sat Jun 23 02:39:07 EDT 2012
     MACHINE: x86_64  (2992 MHz)
      MEMORY: 2 GB
       PANIC: "Oops: 0002" (check log for details)
         PID: 1696
     COMMAND: "insmod“
        TASK: c74de000
         CPU: 0
       STATE: TASK_RUNNING (PANIC)

crash>

前述の例では、次の情報が出力に含まれています。

  • CPU数

  • 過去1分間、5分間および15分間のロード平均

  • 実行中のタスク数

  • メモリーの量

  • パニック文字列

  • ダンプの作成時に実行されていたコマンド

この例では、insmodでモジュールをインストールしようとしたことでoops違反が発生しました。

crash>プロンプトで、helpまたは?と入力すると、使用可能なcrashコマンドを表示できます。help commandと入力すると、指定したコマンドの詳細情報が表示されます。

crashコマンドは、目的に応じて、次に示すグループにグループ化できます。

カーネル・データ構造分析コマンド

カーネルのテキストおよびデータ構造を表示します。「カーネル・データ構造分析コマンド」を参照してください。

システム状態コマンド

システム全体またはタスクごとにカーネル・サブシステムを調査します。「システム状態コマンド」を参照してください。

ヘルパー・コマンド

計算、変換および検索機能を実行します。「ヘルパー・コマンド」を参照してください

セッション制御コマンド

crashセッションを制御します。「セッション制御コマンド」を参照してください

詳細は、crash(8)マニュアル・ページを参照してください。

カーネル・データ構造分析コマンド

次に示すcrashコマンドは、gdb統合を利用して、次のシンボルでカーネル・データ構造を表示します。

*

ポインタ参照コマンドをstructまたはunionのかわりに使用できます。gdbモジュールにより、適切な関数がコールされます。次に例を示します。

crash> *buffer_head
                           
struct buffer_head {
    long unsigned int b_state;
    struct buffer_head *b_this_page;
    struct page *b_page;
    sector_t b_blocknr;
    size_t b_size;
    char *b_data;
    struct block_device *b_bdev;
    bh_end_io_t *b_end_io;
    void *b_private;
    struct list_head b_assoc_buffers;
    struct address_space *b_assoc_map;
    atomic_t b_count;
}
SIZE: 104
dis

全カーネル関数のソース・コードの命令を、指定した命令数について指定アドレスから、または関数の開始から指定アドレスまで逆アセンブルします。次に例を示します。

crash> dis fixup_irqs
                           
0xffffffff81014486 <fixup_irqs>:        push   %rbp
0xffffffff81014487 <fixup_irqs+1>:      mov    %rsp,%rbp
0xffffffff8101448a <fixup_irqs+4>:      push   %r15
0xffffffff8101448c <fixup_irqs+6>:      push   %r14
0xffffffff8101448e <fixup_irqs+8>:      push   %r13
0xffffffff81014490 <fixup_irqs+10>:     push   %r12
0xffffffff81014492 <fixup_irqs+12>:     push   %rbx
0xffffffff81014493 <fixup_irqs+13>:     sub    $0x18,%rsp
0xffffffff81014497 <fixup_irqs+17>:     nopl   0x0(%rax,%rax,1)
...
p

カーネル変数の内容を表示します。次に例を示します。

crash> p init_mm
                           
init_mm = $5 = {
  mmap = 0x0,
  mm_rb = {
    rb_node = 0x0
  },
  mmap_cache = 0x0,
  get_unmapped_area = 0,
  unmap_area = 0,
  mmap_base = 0,
  task_size = 0,
  cached_hole_size = 0,
  free_area_cache = 0,
  pgd = 0xffffffff81001000,
...
struct

構造定義、または指定したアドレスにある構造の内容のフォーマットされた表示のどちらかを表示します。次に例を示します。

crash> struct cpu
                           
struct cpu {
    int node_id;
    int hotpluggable;
    struct sys_device sysdev;
}
SIZE: 88
sym

カーネルのシンボル名をカーネル仮想アドレスとセクションに変換するか、カーネル仮想アドレスをシンボル名とセクションに変換します。また、指定した文字列を含むすべてのシンボルについてのシンボル・リストを問い合せる(-q)ことも、すべてのカーネル・シンボルをリスト(-l)することもできます。次に例を示します。

crash> sym jiffies
                           
ffffffff81b45880 (A) jiffies
crash> sym -q runstate
                           
c590 (d) per_cpu__runstate
c5c0 (d) per_cpu__runstate_snapshot
ffffffff8100e563 (T) xen_setup_runstate_info
crash> sym -l
                           
0 (D) __per_cpu_start
0 (D) per_cpu__irq_stack_union
4000 (D) per_cpu__gdt_page
5000 (d) per_cpu__exception_stacks
b000 (d) per_cpu__idt_desc
b010 (d) per_cpu__xen_cr0_value
b018 (D) per_cpu__xen_vcpu
b020 (D) per_cpu__xen_vcpu_info
b060 (d) per_cpu__mc_buffer
c570 (D) per_cpu__xen_mc_irq_flags
c578 (D) per_cpu__xen_cr3
c580 (D) per_cpu__xen_current_cr3
c590 (d) per_cpu__runstate
c5c0 (d) per_cpu__runstate_snapshot
...
union

structコマンドと同様に、構造体ではなく共用体として定義されているカーネル・データ・タイプを表示します。

whatis

構造体、共用体、typedefの定義、テキストまたはデータ・シンボルを表示します。次に例を示します。

crash> whatis linux_binfmt
                           
struct linux_binfmt {
    struct list_head lh;
    struct module *module;
    int (*load_binary)(struct linux_binprm *, struct pt_regs *);
    int (*load_shlib)(struct file *);
    int (*core_dump)(long int, struct pt_regs *, struct file *, long unsigned int);
    long unsigned int min_coredump;
    int hasvdso;
}
SIZE: 64

システム状態コマンド

次の各コマンドにより、システム全体またはタスクごとのカーネル・サブシステムが表示されます。

bt

現在のコンテキスト、あるいは指定したPIDまたはタスクのカーネル・スタック・トレースを表示します。カーネル・パニックの後に生成されるダンプの場合は、パニックの原因である、呼び出された関数がトレースされます。たとえば:

crash> bt
                           
PID: 10651  TASK: d1347000  CPU: 1   COMMAND: "insmod"
 #0 [d1547e44] die at c010785a
 #1 [d1547e54] do_invalid_op at c0107b2c
 #2 [d1547f0c] error_code (via invalid_op) at c01073dc
...

-lオプションを使用すると、スタック・トレースの各関数コールに対応する、ソース・ファイルの行番号が表示されます。

crash> bt -l 1
                           
PID: 1      TASK: ffff88007d032040  CPU: 1   COMMAND: "init"
 #0 [ffff88007d035878] schedule at ffffffff8144fdd4
    /usr/src/debug/kernel-2.6.32/linux-2.6.32.x86_64/kernel/sched.c: 3091
 #1 [ffff88007d035950] schedule_hrtimeout_range at ffffffff814508e4
    /usr/src/debug/kernel-2.6.32/linux-2.6.32.x86_64/arch/x86/include/asm/current.h: 14
 #2 [ffff88007d0359f0] poll_schedule_timeout at ffffffff811297d5
    /usr/src/debug/kernel-2.6.32/linux-2.6.32.x86_64/arch/x86/include/asm/current.h: 14
 #3 [ffff88007d035a10] do_select at ffffffff81129d72
    /usr/src/debug/kernel-2.6.32/linux-2.6.32.x86_64/fs/select.c: 500
 #4 [ffff88007d035d80] core_sys_select at ffffffff8112a04c
    /usr/src/debug/kernel-2.6.32/linux-2.6.32.x86_64/fs/select.c: 575
 #5 [ffff88007d035f10] sys_select at ffffffff8112a326
    /usr/src/debug/kernel-2.6.32/linux-2.6.32.x86_64/fs/select.c: 615
 #6 [ffff88007d035f80] system_call_fastpath at ffffffff81011cf2
    /usr/src/debug////////kernel-2.6.32/linux-2.6.32.x86_64/arch/x86/kernel/entry_64.S:
    488
    RIP: 00007fce20a66243  RSP: 00007fff552c1038  RFLAGS: 00000246
    RAX: 0000000000000017  RBX: ffffffff81011cf2  RCX: ffffffffffffffff
    RDX: 00007fff552c10e0  RSI: 00007fff552c1160  RDI: 000000000000000a
    RBP: 0000000000000000   R8: 0000000000000000   R9: 0000000000000200
    R10: 00007fff552c1060  R11: 0000000000000246  R12: 00007fff552c1160
    R13: 00007fff552c10e0  R14: 00007fff552c1060  R15: 00007fff552c121f
    ORIG_RAX: 0000000000000017  CS: 0033  SS: 002b

btはおそらく、最も有益なcrashコマンドです。カーネル・スタック・トレースを調査するために使用できるオプションは多数あります。詳細は、help btと入力してください。

dev

キャラクタおよびブロック・デバイス・データを表示します。-dおよび-iオプションを付けると、ディスクI/O統計およびI/Oポート使用率が表示されます。たとえば:

crash> dev
                           
CHRDEV    NAME                 CDEV        OPERATIONS
   1      mem            ffff88007d2a66c0  memory_fops
   4      /dev/vc/0      ffffffff821f6e30  console_fops
   4      tty            ffff88007a395008  tty_fops
   4      ttyS           ffff88007a3d3808  tty_fops
   5      /dev/tty       ffffffff821f48c0  tty_fops
...
BLKDEV    NAME                GENDISK      OPERATIONS
   1      ramdisk        ffff88007a3de800  brd_fops
 259      blkext              (none)
   7      loop           ffff880037809800  lo_fops
   8      sd             ffff8800378e9800  sd_fops
   9      md                  (none)
...
crash> dev -d
                           
MAJOR GENDISK            NAME       REQUEST QUEUE      TOTAL ASYNC  SYNC   DRV
    8 0xffff8800378e9800 sda        0xffff880037b513e0    10     0    10     0
   11 0xffff880037cde400 sr0        0xffff880037b50b10     0     0     0     0
  253 0xffff880037902c00 dm-0       0xffff88003705b420     0     0     0     0
  253 0xffff880037d5f000 dm-1       0xffff88003705ab50     0     0     0     0
crash> dev -i
                           
    RESOURCE        RANGE    NAME
ffffffff81a9e1e0  0000-ffff  PCI IO
ffffffff81a96e30  0000-001f  dma1
ffffffff81a96e68  0020-0021  pic1
ffffffff81a96ea0  0040-0043  timer0
ffffffff81a96ed8  0050-0053  timer1
ffffffff81a96f10  0060-0060  keyboard
...
files

現在のコンテキスト、あるいは特定のPIDまたはタスクのコンテキストで開いているファイルに関する情報を表示します。たとえば:

crash> files 12916
                           
PID: 12916  TASK: ffff8800276a2480  CPU: 0   COMMAND: "firefox"
ROOT: /    CWD: /home/guest
 FD       FILE            DENTRY           INODE       TYPE PATH
  0 ffff88001c57ab00 ffff88007ac399c0 ffff8800378b1b68 CHR  /null
  1 ffff88007b315cc0 ffff88006046f800 ffff8800604464f0 REG  /home/guest/.xsession-errors
  2 ffff88007b315cc0 ffff88006046f800 ffff8800604464f0 REG  /home/guest/.xsession-errors
  3 ffff88001c571a40 ffff88001d605980 ffff88001be45cd0 REG  /home/guest/.mozilla/firefox
  4 ffff88003faa7300 ffff880063d83440 ffff88001c315bc8 SOCK
  5 ffff88003f8f6a40 ffff88007b41f080 ffff88007aef0a48 FIFO
...
fuser

指定したファイル名またはinodeアドレスを現在のルート・ディレクトリ、現在の作業ディレクトリ、オープン・ファイル・ディスクリプタとして参照しているか、ファイルをメモリー・マップしているタスクを表示します。たとえば:

crash> fuser /home/guest
                           
 PID         TASK        COMM             USAGE
 2990  ffff88007a2a8440  "gnome-session"  cwd
 3116  ffff8800372e6380  "gnome-session"  cwd
 3142  ffff88007c54e540  "metacity"       cwd
 3147  ffff88007aa1e440  "gnome-panel"    cwd
 3162  ffff88007a2d04c0  "nautilus"       cwd
 3185  ffff88007c00a140  "bluetooth-appl  cwd
...
irq

割込み要求キューのデータを表示します。たとえば:

crash> irq 0
                           
    IRQ: 0
 STATUS: 400000 ()
HANDLER: ffffffff81b3da30            <ioapic_chip>
         typename: ffffffff815cdaef  "IO-APIC"
          startup: ffffffff8102a513  <startup_ioapic_irq>
         shutdown: ffffffff810aef92  <default_shutdown>
           enable: ffffffff810aefe3  <default_enable>
          disable: ffffffff810aeecc  <default_disable>
              ack: ffffffff8102a43d  <ack_apic_edge>
             mask: ffffffff81029be1  <mask_IO_APIC_irq>
...
kmem

カーネル・メモリー・サブシステムの状態を表示します。たとえば:

crash> kmem -i
                           
              PAGES        TOTAL      PERCENTAGE
 TOTAL MEM   512658         2 GB         ----
      FREE    20867      81.5 MB    4% of TOTAL MEM
      USED   491791       1.9 GB   95% of TOTAL MEM
    SHARED   176201     688.3 MB   34% of TOTAL MEM
   BUFFERS     8375      32.7 MB    1% of TOTAL MEM
    CACHED   229933     898.2 MB   44% of TOTAL MEM
      SLAB    39551     154.5 MB    7% of TOTAL MEM

TOTAL SWAP  1032190       3.9 GB         ----
 SWAP USED     2067       8.1 MB    0% of TOTAL SWAP
 SWAP FREE  1030123       3.9 GB   99% of TOTAL SWAP

kmemには多数のオプションがあります。詳細は、help kmemと入力してください。

log

カーネル・メッセージ・バッファを日付順に表示します。これは、dmesgで表示される同じデータですが、出力には、syslogまたはディスクに記録されなかったメッセージが含まれる場合があります。

mach

cpuinfo構造および物理メモリー・マップなど、マシン固有の情報を表示します。

mod

現在インストールされているカーネル・モジュールに関する情報を表示します。-sおよび-Sオプションを付けると、シンボリック・デバッグを有効にするために、指定したモジュール・オブジェクト・ファイルからデバッグ・データ(使用可能な場合)がロードされます。

mount

現在マウントされているファイル・システムに関する情報を表示します。

net

ネットワーク関連情報を表示します。

ps

プロセスに関する情報を表示します。たとえば:

crash> ps Xorg crash bash
                           
   PID    PPID  CPU       TASK        ST  %MEM     VSZ    RSS  COMM
   2679   2677   0  ffff88007cbcc400  IN   4.0  215488  84880  Xorg
> 13362  11853   0  ffff88007b25a500  RU   6.9  277632 145612  crash
   3685   3683   1  ffff880058714580  IN   0.1  108464   1984  bash
  11853  11845   1  ffff88001c6826c0  IN   0.1  108464   1896  bash
pte

ページ・テーブル・エントリ(PTE)を物理的なページ・アドレスとページ・ビット設定に変換します。PTEでスワップの場所が参照される場合は、スワップ・デバイスおよびオフセットが表示されます。

runq

各CPUの実行キューにあるタスクのリストを表示します。

sig

現在のコンテキストあるいは指定したPIDまたはタスクに対するシグナル処理情報を表示します。

swap

構成済スワップ・デバイスに関する情報を表示します。

task

現在のコンテキストあるいは指定したPIDまたはタスクに対するtask_structの内容を表示します。

timer

タイマー・キュー内のエントリを日付順に表示します。

vm

現在のコンテキストあるいは指定したPIDまたはタスクに対するmm_structのアドレスとページ・ディレクトリ、常駐セット・サイズ、および合計仮想メモリー・サイズなど、仮想メモリー・データを表示します。

vtop

ユーザーまたはカーネル仮想アドレスを物理アドレスに変換します。PTE変換、ユーザー仮想アドレスに対するvm_area_structデータ、物理ページに対するmem_map pageデータ、およびページがマップされていない場合はスワップの場所またはファイルの場所も表示されます。

waitq

指定した待機キューでブロックされているタスクを表示します。

ヘルパー・コマンド

次の各コマンドでは、計算、変換および検索機能が実行されます。

ascii

16進値をASCIIに変換します。引数を指定しない場合は、ASCIIチャートが表示されます。

btop

16進アドレスをページ番号に変換します。

eval

式を評価して、結果を16進数、10進数、8進数およびバイナリで表示します。たとえば:

crash> eval 4g / 0x100
                           
hexadecimal: 1000000  (16MB)
    decimal: 16777216
      octal: 100000000
     binary: 0000000000000000000000000000000000000001000000000000000000000000
list

指定したアドレスから開始して、データ・オブジェクト(通常は構造)のリンクされたリストの内容を表示します。

ptob

ページ番号をその物理アドレス(バイト値)に変換します。

ptov

物理アドレスをカーネル仮想アドレスに変換します。

search

ユーザー仮想メモリー、カーネル仮想メモリーまたは物理メモリーの指定範囲内で指定値を検索します。

rd

選択した範囲のユーザー仮想メモリー、カーネル仮想メモリーまたは物理メモリーを、指定したフォーマットを使用して表示します。

wr

シンボルまたはアドレスで指定したメモリーの場所に値を書き込みます。

注意:

データの損失または破損を回避するために、wrコマンドを使用する際には十分注意してください。

セッション制御コマンド

次の各コマンドでは、crashセッションが制御されます。

alias

コマンドの別名を定義します。引数を指定しない場合は、現在の別名リストが表示されます。

exitqまたはquit

crashセッションを終了します。

extend

指定したcrash拡張共有オブジェクト・ライブラリをロードまたはアンロードします。

foreach

複数のタスクに対して、コマンドbtfilesnettasksetsigvmまたはvtopを実行します。

gdb

処理するために引数をGNUデバッガに渡します。

repeat

[Ctrl]-[C]が入力されるまで、コマンドを無限に繰り返します。このコマンドは、稼働中のシステムを調査するためにcrashを使用する場合にのみ有益です。

set

指定したPIDまたはタスクにコンテキストを設定します。引数を指定しない場合は、現在のコンテキストが表示されます。

ダンプ・ファイルを調査するためのガイドライン

カーネル・クラッシュによるメモリー・ダンプをデバッグするためのステップは、問題に応じて様々に異なります。

次に、いくつかの試してみることができる基本的な調査のガイドラインを示します。

  • btを使用して、カーネル・パニックを発生させた関数をトレースします。

  • bt -aを使用して、各CPU上のアクティブ・タスクをトレースします。たいていの場合、あるCPU上のパニックを起こしたタスクと他のCPU上の実行中タスクの間に関連があります。リストされたコマンドがcpu_idleまたはswapperの場合、CPU上で実行されていたタスクはありませんでした。

  • bt -lを使用して、スタック・トレースの各関数コールに対応する、ソース・ファイルの行番号を表示します。

  • kmem -iを使用して、メモリー使用量とスワップ使用量のサマリーを取得します。500MBを超えているSLAB値および0%を超えているSWAP USED値を検索します。

  • ps | grep UNを使用して、通常はI/Oの待機中であることが原因のTASK_UNINTERRUPTIBLE状態(D状態)のプロセスをチェックします。このようなプロセスはロード平均に関係しており、中断できません。

  • filesを使用して、プロセスでオープンしたファイルを表示します。

次の例に示すように、シェルの間接指定演算子を使用して、コマンドからの出力を後で分析するためにファイルに保存することも、grepなどのコマンドで出力をパイプすることもできます。

crash> foreach files > files.txt
                  
crash> foreach bt | grep bash
                  
PID: 3685   TASK: ffff880058714580  CPU: 1   COMMAND: "bash"
PID: 11853  TASK: ffff88001c6826c0  CPU: 0   COMMAND: "bash"