最近、132 終了ステータス コード (128 + 4: シグナルによってプログラムが中断された + 不正な命令シグナル) によるクラッシュを経験しました。これが、クラッシュの原因となっている命令を特定する方法です。
まず、コア ダンプを有効にしました。
$ ulimit -c unlimited
興味深いことに、バイナリを実行していたフォルダーには、core
. PID をコア ダンプに追加するように Linux に指示する必要がありました。
$ sudo sysctl -w kernel.core_uses_pid=1
次に、プログラムを実行して、という名前のコアを取得しましたcore.23650
。バイナリとコアを gdb でロードしました。
$ gdb program core.23650
gdb に入ると、次の情報が表示されました。
Program terminated with signal SIGILL, Illegal instruction.
#0 0x00007f58e9efd019 in ?? ()
0x00007f58e9efd019
これは、アドレス メモリでの不正な命令が原因で、私のプログラムがクラッシュしたことを意味します。次に、実行された最後の命令を確認するためにasm レイアウトに切り替えました。
(gdb) layout asm
>|0x7f58e9efd019 vpmaskmovd (%r8),%ymm15,%ymm0
|0x7f58e9efd01e vpmaskmovd %ymm0,%ymm15,(%rdi)
|0x7f58e9efd023 add $0x4,%rdi
|0x7f58e9efd027 add $0x0,%rdi
vpmaskmovd
エラーの原因となったのは命令でした。どうやら、AVX2 命令セットをサポートしていないシステムで、AVX2 アーキテクチャ向けのプログラムを実行しようとしていたようです。
$ cat /proc/cpuinfo | grep avx2
最後に、vpmaskmovd が AVX2 のみの命令であることを確認しました。