Introduction
Linux で開発することはそこそこあるが、どうしても gdb を使って開発が好きになれない。
いい加減、コアダンプからクラッシュした行を特定する程度のことは覚えたい次第。
How to do?
簡単な下記のプログラムを実行。
1 |
|
std::cout の行でクラッシュするはず (i が 5 以上のときだが、メモリの状態などが影響するので 5 とは限らない)
1. コアダンプからスタックトレースを調べる
基本。
とはいえ、毎回 gdb を起動して対話形式で、というのは面倒なのでバッチ形式的に実行する。
まず、何がなくともコアダンプの出力制限を解除。
実行したセッションのみな点に注意。
1 | $ ulimit -c unlimited |
次に上記プログラムを実行すると Segmentation fault (core dumped) と出るのでコアダンプファイルを確認する。
ディストリビューションによって出力先が違うが、だいたいは下記の通り。
- Ubuntu 22
/var/lib/apport/coredump
- RHEL 9
/var/lib/systemd/coredump- ただし、
systemd-coredumpで管理されているため、一度ツールでコアダンプを生成する必要がある
- ただし、
下記は Ubuntu 22.04 での実行結果。
1 | $ gdb -batch -ex "bt" ./install/linux/Debug/bin/Test /var/lib/apport/coredump/core._data_work_oss_Demo_DevTools_gdb_01_ShowBackTrace_install_linux_Debug_bin_Test.1000.ee0b66b3-4f20-49fd-9bf5-1cd6ab96b6e2.139698.71179542 |
RHEL 8/9 の場合は coredumpctl list からコアダンプを出力するための情報を確認。
1 | $ coredumpctl list |
最新のコアダンプが欲しいので下記のように PID 及び出力先を指定。
1 | $ coredumpctl dump 132095 -o my_core.dump |
あとは Ubuntu と同様。
1 | $ gdb -batch -ex "bt" ./install/linux/Debug/bin/Test my_core.dump |
2. 最初からスタックトレースを出力する
クラッシュすることがわかっているならクラッシュしたと同時にトレースを出すこともできる。
1 | $ gdb -batch -ex "run" -ex "bt" --args ./install/linux/Debug/bin/Test |
当然だが、Release ビルドだったり、ビルド時に -g 等のデバッグオプションを付与しないとスタックトレースは出力されない。
1 | $ gdb -batch -ex "run" -ex "bt" --args ./install/linux/Release/bin/Test |
