プログラミングなどなど

プログラミングに関係しそうな内容を

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