SPIN:状態の探索(2プロセス)(探索)
前回「Pr: 0 Tr: 6」で探索が切れているように見える部分が気になったので、デバッグしてみました。調べられた感じでは、プロセスの削除順序が関係しているようです。一応、「プロセスは生成順序と逆順で消滅する」と記載のある資料を見つけたのでこの記述の動作に該当してそうです。ただ、1次情報までは見つけられませんでした。
使用したソースから検証器の実行まで
ソース 2p.pmlを使用しています。検証器の生成とコンパイルも前回と同様となります。
デバッグ
トライ&エラーは省きますが、調べていくとdo_transitとdelprocに行き着きました。
(gdb) break do_transit
Breakpoint 1 at 0x404d: file pan.c, line 5887.
(gdb) break delproc
Breakpoint 2 at 0x93c6: file pan.c, line 10440.
(gdb) run
Starting program: /home/makoto/blog/16_delproc/pan
0: Down - program non-accepting [pids 1-0]
New state 0
State: 2,0,0,0,0,0,28,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,1,9,0,0,
Vector: 2,0,0,0,0,0,28,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,1,9,0,0,
:
(gdb) c
Continuing.
Pr: 0 Tr: 6 <-- 気になる部分
Breakpoint 2, delproc (sav=1, h=0) at pan.c:10440 <-- h=0はプロセスp
10440 { int d, i=0;
(gdb) n
10444 if (h+1 != (int) now._nr_pr)
(gdb)
10445 { return 0;
(gdb) list
10440 { int d, i=0;
10441 #ifndef NOCOMP
10442 int o_vsize = vsize;
10443 #endif
10444 if (h+1 != (int) now._nr_pr) <-- この条件が成立し
10445 { return 0; <-- delprocを抜けている。(プロセスqはまだ生きている。)
10446 }
10447 #ifdef TRIX
10448 #ifdef V_TRIX
10449 printf("%4d: delproc %d -- parent %d\n", depth, h, processes[h]->parent_pid);
(gdb) n
10530 }
(gdb)
do_transit (t=0x55555576c350, II=0) at pan.c:5910
5910 }
:
(gdb) n
new_state () at pan.c:7126
7126 { continue;
(gdb) list
7121 #ifdef INLINE
7122 #include FORWARD_MOVES
7123 P999: /* jumps here when move succeeds */
7124 #else
7125 if (!(_m = do_transit(t, II)))
7126 { continue; <-- このルートに入り次の探索に進んでいる。
7127 }
7128 #endif
7129 #ifdef BCS
7130 if (depth > BASE
デバッグ補助
上記をみるとソースにプリプロセスディレクディブが多く含まれてきます。これがあるとかなりソースが読みにくいです。実は、この結果に行き着く際にはpan.cに含まれているコメント「gcc -E -DNOREDUCE -DBITSTATE pan.c > ppan.c」を参考に以下のようにコンパイルしてデバッグしました。
$ gcc -E -DVERBOSE -DSDUMP -DNOCOMP -DNOREDUCE pan.c | indent -sob -st -bli0 | expand | sed '/^#/d' > ppan.c $ gcc -w -g3 ppan.c -o pan