スポンサーリンク

このドキュメントの内容は、以下の通りです。

はじめに

オペレーティングシステムでは、さまざまなプログラムが実行されています。実行中のプログラムのことをプロセスと呼びます。

ソフトウェアを開発している場合には、プログラムが異常終了した場合には、調査を行い、原因を特定して、問題を解決しなければなりません。
プログラムが異常終了をしない場合であっても、なんらかの不具合があれば、やはり、調査を行い、原因を特定と問題解決が要求されます。

プログラムの状態を知るためには、プログラムが利用しているメモリの内容を知る必要があります。メモリの内容を取得し、デバッガなので中身を解析することになります。

ここでは、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コマンドを使うことで、プロセスの動作を可能な限り、停止する時間を減らし、デバッグすることができます。

スポンサーリンク
スポンサーリンク
 
いつもシェア、ありがとうございます!


もっと情報を探しませんか?

関連記事

最近の記事

人気のページ

スポンサーリンク
 

過去ログ

2020 : 01 02 03 04 05 06 07 08 09 10 11 12
2019 : 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

サイト

Vim入門

C言語入門

C++入門

JavaScript/Node.js入門

Python入門

FreeBSD入門

Ubuntu入門

セキュリティ入門

パソコン自作入門

ブログ

トップ


プライバシーポリシー