このページは機械翻訳されています。英語の原文をお読みください。 English

IBSurgeon ライブラリ

LinuxでFirebirdのダンプを収集し、スタックトレースを生成する方法

はじめに

Firebirdでハングアップや異常終了などの深刻な問題が発生した場合、ダンプ収集を設定し、スタックトレースを作成する必要があります。ダンプとスタックトレースにより、IBSurgeonのFirebirdコア開発者がハングアップ/障害の詳細な状況を分析し、解決策を提供できます。

ダンプおよびスタックトレース分析は、IBSurgeonの高度なFirebirdテクニカルサポートサービスの一部として利用できます。プランはUSD199/サーバー/月から始まり、チャット(WhatsApp、Telegramなど)によるサポートが含まれているため、深刻な問題が発生した場合でもほぼ即座に専門家の支援を受けることができます。
詳細については、/ja/enterprise-subscription-plans-for-firebird/をご覧ください。
以下のすべての操作にはrootまたはsudoer権限が必要です。

1. 前提条件

1.1 干渉するパッケージの削除または停止

Ubuntu/Debian

  • systemd-coredump
Code
apt-get purge --auto-remove systemd-coredump

削除を確認するには:

Code
cat /proc/sys/kernel/core_pattern

次のような出力があってはなりません:

Code
/lib/systemd/systemd-coredump%P %u %g %s %t %e
  • apport
Code
# 検索
service --status-all | grep -m1 -i apport

# 削除のシミュレーション
apt-get -s remove apport

# 削除
sudo apt-get remove apport

# 残存ファイルのクリーンアップ
sudo apt-get purge apport

CentOS/RedHat

  • abrtd

確認するには:

Code
cat /proc/sys/kernel/core_pattern

次のような出力が表示される場合:

Code
/usr/libexec/abrt-hook-ccpp %s %c %p %u %g%t e %P %I

abrtdを停止して削除します:

CentOS 6の場合:

Code
service abrtd stop

CentOS 7の場合:

Code
systemctl disable abrtd.service

削除:

Code
yum -y remove abrt*

# 残存ファイルのクリーンアップ
rm -r /var/cache/abrt/

# クリーンアップの確認
cat /var/log/yum.log | grep abrt

1.2 GDBのインストール

GDBは収集したダンプからスタックトレースを作成するために必要です。GDBのインストールはパフォーマンスに影響を与えず、Firebirdを「デバッグ」モードにすることもありません。

CentOSの場合:

Code
yum install gdb

Ubuntu/Debianの場合:

Code
apt-get install gdb

2. ダンプサイズ制限の解除

現在のダンプサイズ制限を確認:

Code
ulimit -c

0が表示される場合、ダンプ作成は禁止されています。

systemdを使用するシステムでは、サービスファイルを変更します:

CentOS/RedHat

Code
/usr/lib/systemd/system/firebird-superserver.service

Ubuntu/Debian

Code
/lib/systemd/system/firebird-superserver.service

[Service]セクションに追加:

Code
LimitCORE=infinity

サービスを再起動:

Code
systemctl daemon-reload
systemctl restart firebird-superserver.service

無制限のダンプサイズを確認:

Code
strings /proc/$(pgrep firebird)/limits

3. ダンプファイルの場所と命名の設定

この手順は任意ですが、意味のあるダンプファイル名を指定し、十分なストレージ容量を確保するために強く推奨されます。

一時的な設定

Code
sysctl -w kernel.core_pattern=/path/to/dumps/core.%e.%t.%p

永続的な設定

/etc/sysctl.confに追加:

Code
kernel.core_pattern=/path/to/dumps/core.%e.%t.%p

所有権の設定

Code
chown firebird /path/to/dumps -R

4. ダンプ収集のテスト

前提条件

  1. SSHを再起動

  2. ulimit -cが「unlimited」を返すことを確認

テストクラッシュコマンド

Firebird 3+(SuperServerまたはSuperClassic)

Code
echo "shell kill -6 $(pgrep firebird);" | /opt/firebird/bin/isql -q localhost:employee -user sysdba -pas masterkey

Firebird 2.5(SuperClassic)

Code
echo "shell kill -6 $(pgrep fb_smp_server);" | /opt/firebird/bin/isql -q localhost:employee -user sysdba -pas masterkey

クラシックモード

Code
select mon$server_pid from mon$attachments where mon$attachment_id = current_connection;
shell kill -6 <見つかったPID>;

5. デバッグファイルのインストール

- デバッグファイルはFirebirdのビルドバージョンと一致している必要があります

- デバッグファイルのインストールはパフォーマンスに影響しません

- Firebirdを更新する際はデバッグファイルも更新してください

期待されるデバッグファイルの場所:

Code
/opt/firebird/bin/.debug/firebird.debug
/opt/firebird/bin/.debug/gbak.debug
/opt/firebird/bin/.debug/isql.debug
/opt/firebird/lib/.debug/libfbclient.so.3.0.11.debug
/opt/firebird/lib/.debug/libib_util.so.debug
/opt/firebird/plugins/.debug/libfbtrace.so.debug
/opt/firebird/plugins/.debug/libEngine12.so.debug
HQbirdのインストールには正しいデバッグファイルが含まれており、更新も自動的に処理されます。

6. 実行中プロセスからのスタックトレース作成

  1. gdb-commands.txtを作成:
Code
thread apply all bt
quit
yes
  1. スタックトレースを生成:
Code
gdb -q -x ./gdb-commands.txt /opt/firebird/bin/firebird $(pgrep firebird) 1>./stacktrace.txt 2>&1

7. 実行中プロセスからのダンプ作成

Code
gcore -o /path/to/dumps/firebirdprefix $(pgrep firebird)
ツールはプレフィックスにプロセスIDを追加します。

8. 既存ダンプからのスタックトレース作成

Code
gdb -q -x ./gdb-commands.txt /opt/firebird/bin/firebird /tmp/core.firebird.23041 1>./stacktrace1.txt 2>&1

9. 詳細なダンプ分析

共有ライブラリを分析するには:

Code
echo -e "info sharedlibrary\nquit\n" | gdb