7 クラッシュ・ダンプの使用
この章では、システム・クラッシュの発生時にメモリー・イメージを作成するようにシステムを構成する方法と、crashデバッガを使用してクラッシュ・ダンプまたは稼働中システムのメモリー・イメージを分析する方法について説明します。
Kdumpについて
Kdumpは、Linuxカーネルのクラッシュ・ダンプ・メカニズムです。Kdump機能は有効にすることをお薦めします。システム・クラッシュが発生すると、Kdumpによって、クラッシュの原因を特定するために役立つメモリー・イメージ(vmcore
)が作成されます。Kdumpを有効にする場合、Kdumpによる排他的な使用のためにシステム・メモリーの一部を予約する必要があります。このメモリーは、他の用途には使用できません。
Kdumpでは、システム・クラッシュのたびにkexec
を使用してセカンド・カーネルをブートします。kexec
は、ブート・ローダー・ステージの操作なしで、すでに実行中のカーネルのコンテキスト内からLinuxカーネルをブートできるようにする高速ブート・メカニズムです。
Kdumpの構成および使用
インストール中に、Kdumpを有効にするオプションを選択して、そのために予約するメモリー容量を指定できます。必要に応じて、この項で説明するとおり、後からkdumpを有効にできます。
使用中のシステムにkexec-tools
およびsystem-config-kdump
パッケージがまだインストールされていない場合は、yumを使用してインストールします。
-
次のコマンドを入力します。
sudo system-config-kdump
カーネル・ダンプ構成GUIが起動します。Kdumpが現在無効の場合、緑色の有効化ボタンが選択可能となり、無効化ボタンはグレー表示されます。
-
有効化をクリックしてKdumpを有効にします。
-
次の設定タグを選択して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
-
システムの電源を切ります。
これらの設定の詳細は、ヘルプをクリックしてください。
-
「適用」をクリックして変更を保存します。GUIに、変更を有効にするにはシステムを再起動する必要があるというポップアップ・メッセージが表示されます。
-
OKをクリックしてポップアップ・メッセージを閉じます。
-
「File」→「Quit」を選択します。
-
適切な時点でシステムを再起動します。
Kdumpが使用するファイル
カーネル・ダンプ構成GUIによって次のファイルが変更されます。
ファイル | 説明 |
---|---|
|
カーネル行に |
|
ダンプ・ファイルを書き込むことができる場所、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
パッケージと適切なdebuginfo
とdebuginfo-common
パッケージをインストールする必要があります。
必要なパッケージをインストールするには:
-
最新バージョンの
crash
パッケージをインストールします。sudo yum install crash
-
調査する
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
-
-
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
-
コマンドの別名を定義します。引数を指定しない場合は、現在の別名リストが表示されます。
- exit、qまたはquit
-
crashセッションを終了します。
- extend
-
指定したcrash拡張共有オブジェクト・ライブラリをロードまたはアンロードします。
- foreach
-
複数のタスクに対して、コマンドbt、files、net、task、set、sig、vmまたは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"