プログラムでセグメント不正 (SIGSEGV) が発生するのは、プログラムが使用可能なメモリー範囲外のメモリーアドレスを参照したことを示します。
セグメント不正の主な原因を以下に示します。
配列インデックスが宣言された範囲外にある。
配列インデックス名のつづりが間違っている。
呼び出し元のルーチンでは引数に REAL を使用しているが、呼び出し先のルーチンでは INTEGER が使われている。
配列インデックスの計算が間違っている。
呼び出し元ルーチンの引数が足りない。
ポインタを定義しないで使用している。
問題のあるソース行を見つけるには、dbx を使用してセグメント不正が発生したソースコード行を検出します。
demo% cat WhereSEGV.f
INTEGER a(5)
j = 2000000
DO 9 i = 1,5
a(j) = (i * 10)
9 CONTINUE
PRINT *, a
END
demo%
dbx を使用してセグメント不正が発生した行番号を検出します。
demo% f77 -g -silent WhereSEGV.f
demo% ./a.out
*** TERMINATING ./a.out
*** Received signal 11 SIGSEGV
Segmentation fault (core dumped)
demo% dbx a.out
a.out の読み込み中
rtld /usr/lib/ld.so.1 の読み込み中
libF77.so.3 の読み込み中
libsunmath.so.1 の読み込み中
libm.so.1 の読み込み中
libc.so.1 の読み込み中
libdl.so.1 の読み込み中
(dbx) run
実行中: a.out
(プロセス id 2273)
mb.so.1 の読み込み中
wcwidth.so.1 の読み込み中
シグナル SEGV (フォルトのアドレスにマッピングしていません) 関数 MAIN 行番号 4 ファイル "WhereSEGV.f"
4 a(j) = (i * 10)
(dbx)