Technically Impossible

Lets look at the weak link in your statement. Anything "Technically Impossible" basically means we haven't figured out how yet.

コアダンプの出力確認からcoredumpctl、gdbによる確認までの手順

気付いたら、とあるFlatpakアプリケーションが起動しなくなっていた。コマンドから起動すると、segmentation faultによりコアダンプを出力していた。

Windowsの場合、コアダンプさえあればWinDbgで中身を確認することができる*1Linuxの場合も、coredumpctl*2で同様のことは可能だが、特にgdb*3の場合、次の情報を特定する必要がある。

  • コアダンプ
  • 実行ファイル
  • 共有ライブラリ

遭遇した障害を報告する際にも、これらの情報提供が要求されることが多い。この投稿では、これらの情報を特定するまでの一連の操作を紹介する。

ちなみに、この投稿での検証環境にはClear Linux*4を用いている。とはいえ、基本的にはどのLinuxディストリビューションでも共通に機能するはずだ。

事前確認

coredumpctl、あるいはgdbを操作する前に、次のコマンドを実行する。

ulimit -a

cat /proc/sys/kernel/core_pattern
ls -la /usr/lib/systemd/coredump-wrapper
cat /usr/lib/systemd/coredump-wrapper

一連のコマンドで、次のことを確認している。

  1. 使用環境でコアダンプが出力されているか確認する。
  2. 「/proc/sys/kernel/core_pattern」を参照し、出力方法を確認する。
  3. 「coredump-wrapper」を調べると、シェルスクリプトであることが分かる。
  4. 「coredump-wrapper」の内容を調べる。

「ultimate -a」の、特に次の出力から、コアダンプが出力される環境が整っていることが分かる。

core file size unlimited
file size unlimited

「core_pattern」の記述から、「/usr/lib/systemd/coredump-wrapper」へパイプで引き渡されていることが分かる。
「coredump-wrapper」の内容を確認すると、最終的に「crashprobe」か「systemd-coredump」によってダンプ出力されていることが分かる。この投稿で使用している環境には「crashprobe」をインストールしていないため、「systemd-coredump」が使用されることになる。その出力を確認するには「coredumpctl」を使用する。

coredumpctl

まず「coredumpctl」を実行する。今回の障害はFlatpakアプリケーションに起因するので、「flatpak」に関連するダンプを確認する必要がある。

coredumpctl
coredumpctl list flatpak --since=2023-04-01

「coredumpctl」から問題のアプリケーション(実行ファイル)を指定することで、コアダンプを指定することなく「gdb」を起動できる。この時点で、障害の原因らしきところまで表示されていることが分かる。

coredumpctl debug flatpak

🔎「coredumpctl debug flatpak」の出力

ここからは「gdb」と操作は同じだ。バックトレースを確認し、共有ライブラリを特定する。

bt
info share

ここまでに収集した情報を共有すれば、障害は解決するかもしれない。もし情報だけでなく、ファイルの提供を要求された場合、冒頭で触れた次のファイルを共有することになる。いずれも、これまでの情報の中でパスまで特定されている。

  • コアダンプ
  • 実行ファイル
  • 共有ライブラリ

gdb

「coredumpctl」ではなく、直接「gdb」を用いる場合、まずコアダンプの出力先と、目的のダンプ・ファイルを特定する必要がある。

Clear Linuxの場合、ダンプファイルは「/var/lib/systemd/coredump/」にzstの圧縮ファイルとして格納されている。目的のファイルをフォルダ「~/work/debug/」へファイル「core」として展開する。

このファイルを実行ファイルとともに指定して「gdb」を実行すればよい。

ls -la /var/lib/systemd/coredump/
zstd -d /var/lib/systemd/coredump/目的のファイル.zst -o ~/work/debug/core

gdb flatpak ~/work/debug/core