Introduction

Linux で開発することはそこそこあるが、どうしても gdb を使って開発が好きになれない。
いい加減、コアダンプからクラッシュした行を特定する程度のことは覚えたい次第。

How to do?

簡単な下記のプログラムを実行。

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <vector>

int main()
{
std::vector<int> vec = {1, 2, 3, 4, 5};
for (size_t i = 0; ; ++i)
std::cout << vec[i] << std::endl;

return 0;
}

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
2
3
4
5
6
7
8
9
$ 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
[New LWP 139698]
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Core was generated by `./install/linux/Debug/bin/Test'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x0000629ba761b351 in main () at /data/work/oss/Demo/DevTools/gdb/01_ShowBackTrace/main.cpp:8
8 std::cout << vec[i] << std::endl;
#0 0x0000629ba761b351 in main () at /data/work/oss/Demo/DevTools/gdb/01_ShowBackTrace/main.cpp:8

RHEL 8/9 の場合は coredumpctl list からコアダンプを出力するための情報を確認。

1
2
3
4
5
$ coredumpctl list
TIME PID UID GID SIG COREFILE EXE SIZE
Sun 2026-06-07 21:08:02 JST 131944 0 0 SIGSEGV inaccessible /home/t-takeuchi/Work/Demo/DevTools/gdb/01_ShowBackTrace/install/linux/Debug/bin/Test -
Sun 2026-06-07 21:09:55 JST 132095 1000 1000 SIGSEGV present /home/t-takeuchi/Work/Demo/DevTools/gdb/01_ShowBackTrace/install/linux/Debug/bin/Test 49.8K
Sun 2026-06-07 21:20:05 JST 132304 1000 1000 SIGSEGV present /home/t-takeuchi/Work/Demo/DevTools/gdb/01_ShowBackTrace/install/linux/Debug/bin/Test 49.8K

最新のコアダンプが欲しいので下記のように PID 及び出力先を指定。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ coredumpctl dump 132095 -o my_core.dump
PID: 132095 (Test)
UID: 1000 (t-takeuchi)
GID: 1000 (t-takeuchi)
Signal: 11 (SEGV)
Timestamp: Sun 2026-06-07 21:09:55 JST (22min ago)
Command Line: ./install/linux/Debug/bin/Test
Executable: /home/t-takeuchi/Work/Demo/DevTools/gdb/01_ShowBackTrace/install/linux/Debug/bin/Test
Control Group: /user.slice/user-1000.slice/session-4.scope
Unit: session-4.scope
Slice: user-1000.slice
Session: 4
Owner UID: 1000 (t-takeuchi)
Boot ID: 263ea725db5348668b40d8b73b01896f
Machine ID: 1d18a8ff1143418abac1c21beefbaa00
Hostname: esxi-vm11
Storage: /var/lib/systemd/coredump/core.Test.1000.263ea725db5348668b40d8b73b01896f.132095.1780834195000000.zst (present)
Size on Disk: 49.8K
Message: Process 132095 (Test) of user 1000 dumped core.

Stack trace of thread 132095:
#0 0x000000000040228b main (Test + 0x228b)
#1 0x00007f75b722a610 __libc_start_call_main (libc.so.6 + 0x2a610)
#2 0x00007f75b722a6c0 __libc_start_main@@GLIBC_2.34 (libc.so.6 + 0x2a6c0)
#3 0x0000000000402135 _start (Test + 0x2135)
ELF object binary architecture: AMD x86-64

あとは Ubuntu と同様。

1
2
3
4
5
6
7
8
9
$ gdb -batch -ex "bt" ./install/linux/Debug/bin/Test my_core.dump
[New LWP 132095]
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
Core was generated by `./install/linux/Debug/bin/Test'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x000000000040228b in main () at /home/t-takeuchi/Work/Demo/DevTools/gdb/01_ShowBackTrace/main.cpp:8
8 std::cout << vec[i] << std::endl;
#0 0x000000000040228b in main () at /home/t-takeuchi/Work/Demo/DevTools/gdb/01_ShowBackTrace/main.cpp:8

2. 最初からスタックトレースを出力する

クラッシュすることがわかっているならクラッシュしたと同時にトレースを出すこともできる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ gdb -batch -ex "run" -ex "bt" --args ./install/linux/Debug/bin/Test
1
2
3
4
5
0
0
...
0
0

Program received signal SIGSEGV, Segmentation fault.
0x000000000040228b in main () at /home/t-takeuchi/Work/Demo/DevTools/gdb/01_ShowBackTrace/main.cpp:8
8 std::cout << vec[i] << std::endl;
#0 0x000000000040228b in main () at /home/t-takeuchi/Work/Demo/DevTools/gdb/01_ShowBackTrace/main.cpp:8

当然だが、Release ビルドだったり、ビルド時に -g 等のデバッグオプションを付与しないとスタックトレースは出力されない。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ gdb -batch -ex "run" -ex "bt" --args ./install/linux/Release/bin/Test
1
2
3
4
5
0
0
...
0
0

Program received signal SIGSEGV, Segmentation fault.
0x000000000040116a in main ()
#0 0x000000000040116a in main ()