gcoreコマンドで実行中のプロセスのコアイメージを取得する方法
スポンサーリンク
このドキュメントの内容は、以下の通りです。
はじめに
オペレーティングシステムでは、さまざまなプログラムが実行されています。実行中のプログラムのことをプロセスと呼びます。ソフトウェアを開発している場合には、プログラムが異常終了した場合には、調査を行い、原因を特定して、問題を解決しなければなりません。
プログラムが異常終了をしない場合であっても、なんらかの不具合があれば、やはり、調査を行い、原因を特定と問題解決が要求されます。
プログラムの状態を知るためには、プログラムが利用しているメモリの内容を知る必要があります。メモリの内容を取得し、デバッガなので中身を解析することになります。
ここでは、LinuxやFreeBSDなどのUnixのオペレーティングシステムでのメモリの内容の取得方法について説明します。
コアファイルとは
LinuxやFreeBSDなどのUnixでは、実行中のプログラムがクラッシュ(異常終了)した場合、コアファイルを保存することが可能です。コアファイルが作成されるかは、設定に依存します。コアファイルが作成されることをコアダンプと言います。また、「コアを吐いた」と表現する方もいます。異常終了時以外にも、コアファイルを取得することが可能です。
実行中のコアファイルの取得方法
実行中のプロセスのコアイメージを取得したいときは、gcoreコマンドで取得することができます。gcoreは, get core images of running processです。
gcoreのインストール
Ubuntu や CentOS では、 gcore コマンドは gdbのパッケージに付属しています。 gdb とは、 GNU が開発した デバッガのソフトウェアです。Ubuntu の環境で確認しました。
$ dpkg -L gdb |fgrep gcore /usr/bin/gcore /usr/share/man/man1/gcore.1.gz
Ubuntu でインストールする場合は、以下の通りです。
sudo apt install gdb
CentOS でインストールする場合は、以下の通りです。
sudo dnf install gdb
CentOS で dnf がなく yum コマンドがある場合は、以下の通りです。
sudo yum install gdb
FreeBSD では、gcore はデフォルトでインストールされています。ただし、FreeBSD 12.1-RELEASE では、 gdb は別途インストールが必要です。
gcoreの使い方
pidには、取得したいプロセスのPIDを指定します。% gcore pid
ps コマンドで 取得したいプロセスのpidを確認します。 この例では、 httpdのプロセスを調べました。
% ps auxww|fgrep httpd www 5954 4.6 4.6 38764 22188 ?? S 9:08PM 5:22.06 /usr/local/sbin/httpd www 5945 3.2 4.6 38712 22132 ?? S 9:08PM 5:41.32 /usr/local/sbin/httpd www 5951 3.2 4.6 38740 22160 ?? S 9:08PM 5:32.62 /usr/local/sbin/httpd www 5948 3.0 4.7 39252 22492 ?? S 9:08PM 5:26.11 /usr/local/sbin/httpd www 5953 2.1 4.6 38756 22192 ?? S 9:08PM 5:28.58 /usr/local/sbin/httpd % sudo gcore 5954 % ls core.5954
上記のコマンドから core.pidというファイル名でコアイメージが保存されます。
gdbは動作中プロセスをアタッチ可能
gdb コマンドで実行中のプロセスをアタッチすることができますが、 サービスしているシステムで、gdb でサービスのためのプロセスを掴んでしまうとサービスの邪魔になってしまいます。サービス的に問題があるときに、gcore コマンドでさくっとコアを手に入れ、 そのコアをじっくりいじるのがいいでしょう。gdbからgcoreを実行する方法
以下は、exコマンドをgdbでattachしてcoreを取得する例です。
% gdb GNU gdb 6.1.1 [FreeBSD] Copyright 2004 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i386-marcel-freebsd". (gdb) attach 67285 Attaching to process 67285 /usr/src/gnu/usr.bin/gdb/libgdb/../../../../contrib/gdb/gdb/solib-svr4.c:1443: internal-error: legacy_fetch_link_map_offsets called without legacy link_map support enabled. A problem internal to GDB has been detected, further debugging may prove unreliable. Quit this debugging session? (y or n) n /usr/src/gnu/usr.bin/gdb/libgdb/../../../../contrib/gdb/gdb/solib-svr4.c:1443: internal-error: legacy_fetch_link_map_offsets called without legacy link_map support enabled. A problem internal to GDB has been detected, further debugging may prove unreliable. Create a core file of GDB? (y or n) n Reading symbols from /usr/bin/ex...(no debugging symbols found)...done. Reading symbols from /lib/libncurses.so.6...(no debugging symbols found)...done. Loaded symbols for /lib/libncurses.so.6 Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done. Loaded symbols for /lib/libc.so.6 Reading symbols from /libexec/ld-elf.so.1...(no debugging symbols found)...done. Loaded symbols for /libexec/ld-elf.so.1 0x281c334f in read () from /lib/libc.so.6 (gdb) gcore core Saved corefile core (gdb) detach Detaching from program: /usr/bin/ex, process 67285 (gdb) % ls -lt|head total 245054 -rw-r--r-- 1 kaworu guest 1959644 10 18 00:37 core
まとめ
まとめると以下のコマンドになります。 途中でなにか聞かれてもとりあえず、GDBの next の nを実行します。
% gdb (gdb) attach pid (gdb) gcore core (gdb) detach
上記の動作をラップした gdb_gcore.sh なんてスクリプトもあります。 FreeBSDのソースツリーだと /usr/src/contrib/gdb/gdb/gdb_gcore.sh です。 このスクリプトは、gdbに上記のコマンドをヒアドキュメントで流し込んでいるだけのスクリプトです。
gcoreコマンドを使うことで、プロセスの動作を可能な限り、停止する時間を減らし、デバッグすることができます。
スポンサーリンク
スポンサーリンク
いつもシェア、ありがとうございます!
もっと情報を探しませんか?
関連記事
最近の記事
- パナソニック ジェットウォッシャードルツ EW-DJ61-Wのホースの修理
- LinuxセキュリティモジュールIntegrity Policy Enforcement
- アマゾンのEcho Show 5を買ったのでレビューします
- アマゾンのサイバーマンデーはAlexa Echo Show 5が安い
- Android スマートフォン OnePlus 7T と OnePlus 7の違い
- Android スマートフォン OnePlus 7 をAndroid10にアップデートしてみた
- クレジットカードのバーチャルカードの比較のまとめ
- 活動量計 Xiaomi Mi Band 4を買ってみたのでレビュー
- Android スマートフォン OnePlus 7 のレビュー
- AliExpressでスマートフォンを買い物してみた
- パソコンのホコリ対策 レンジフードフィルターと養生テープ
- 80PLUS GOLDのPC電源ユニットAntec NeoEco 750 Goldのレビュー
- イギリスの付加価値税 VAT は払い戻しを受けられる
- イギリスのロンドンでスーツケースなど荷物を預けられる場所は
- イギリスのロンドンで地下鉄やバスに乗るならオイスターカードを使おう
- イギリスのヒースロー空港からロンドン市内への行き方
- 航空便でほかの航空会社に乗り継ぎがある場合のオンラインチェックイン
- SFC会員がANA便ではなくベトナム航空のコードシェアを試して解ったこと
- ベトナムの入国審査でeチケットの掲示が必要だった話
- シアトルの交通ICカードはオルカカード(Orca)です
人気のページ
- Windows7 IME 辞書ツールで単語の登録に失敗しました
- C言語 popen()でコマンドを実行して出力を読み込む
- Windows7で休止状態にする方法
- CentOS MySQLの起動、停止、再起動
- loggerコマンドでsyslogにエラーを出力する方法
- パソコンパーツの買取をしてくれる店のまとめ
- Java Mapの使い方 get(),put(),remove(),size(),clear()
- 楽天のRポイントカードを作ってみた
- iPhone 5 から iPhone 6 に乗り換えたのでレビュー
- netstatコマンドのステータスの意味
スポンサーリンク
過去ログ
2020 : 01 02 03 04 05 06 07 08 09 10 11 122019 : 01 02 03 04 05 06 07 08 09 10 11 12
2018 : 01 02 03 04 05 06 07 08 09 10 11 12
2017 : 01 02 03 04 05 06 07 08 09 10 11 12
2016 : 01 02 03 04 05 06 07 08 09 10 11 12
2015 : 01 02 03 04 05 06 07 08 09 10 11 12
2014 : 01 02 03 04 05 06 07 08 09 10 11 12
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12