伝説のデバッガー『眠りのケン』〜Undelivered message〜

鎌田勝浩 作
2005/10/16 初稿


[目次へ]


III. デバッグ開始

仕込み

 小会議室では、健治が一人、山のような紙ファイルと格闘していた。やがて、見ていたファイルを閉じ、傍らに置いておいた紙コップのコーヒーを一口飲んでから、つぶやく。
「なるほど、こういうゲームなのか。大体頭に入ったぞ。それじゃ、問題のソースでも拝ませてもらいましょうか」
 目の前の会議机の上に置いてある片目眼鏡状のヘッドマウントディスプレイを装着し、おもむろに操作をし始める。
 やがて、健治の見た目、ヘッドマウントディスプレイ画面がモニタ画面に重なって見えてくる。

仮想空間

 何もない空間が広がっている。そこに、健治が一人、ぽつんと存在していた。
「ベルザンディ、起動!」
 そう、健治が叫ぶと、まばゆい光が現れ、やがてその中から、女神が出現した。
「お呼びですか、マスター」
 ベルザンディと呼ばれたその存在は、普通の人間より一回り小柄な女性の姿だった。床から少し浮上しているため、見かけ上の背丈は、健治より少し小さい位に見えた。
「ベル、まずはソースプログラムをサーバーからダウンロードして、展開してくれ」
「了解しました、マスター」
 奥の空間が輝いたかと思うと、何か構造物が出現した。遠目には、葉書のような薄い板が大量に集合してうごめいているように見える。

 ちなみに、これは健治の頭の中の想像上のイメージであって、実際には存在していない。現実の健治は、あくまで小会議室に籠ってモニター画面を見ながら、猛然とキーボード操作をしながら作業しているだけである。

 さて、健治の頭の中の想像上のデバッグ仮想空間に戻ろう。

「よし、次はソースのプログラム構造、データ構造解析
「了解です。マスター」
 先ほどの葉書状の物体群が、その声に反応して動き出し、形を取り始めた。空中で、時に分岐し、時に統合しながら、あたかも3次元空間上でのドミノ倒しのように整列していく。
「よし、ベル。ソースのブラウジング
 ベルザンディは、健治と一緒に飛行し、物体群に向かう。近づくと、一辺が数メートルの、かなり大きな物である事が判る。その一群に突っ込むと、内部は、まるで洞窟か、ダンジョンのような形状をしていた。その中を飛び回る健治とベルザンディ。
 やがて、最初の全体が俯瞰できる場所まで戻って来た。
「プログラムの流れは大体分かったぞ。怪しいのはあそことあそこ、それにそこ辺りだな」
 健治が指差すと、その先の葉書状の物体に、印がつく。
 腕を組んで考え込む。
(うーん。怪しそうなところは分かったけど、見た所、どうもバグらしい所は見当たらないようだな。……仕方ない、またオヤジさんに頼ってみるか)
「よし、ベルザンディ、ありがとう。またよろしく頼むよ」
「はい、マスター」
 笑顔のベルザンディ、そのまま輝いてスッと消えていった。

 * * *

 室内は既に薄暗くなっていた。そんな薄暗い小会議室に一人、机に座ってモニター画面を見つめていた。
 健治は、ヘッドマウントディスプレイを頭から外して机に置いた。目の前の机の上を少し整理して場所をあけ、あくびをし、おもむろにうつ伏せ、そのまま眠り始めた。

小人さん

 気がつくと、健治は先ほどのデバッグ仮想空間と同じような世界の中にいた。輪郭がぼんやりしている点が、少し違う。また、彼方にはうっそうと木が生い茂った原始林の山がそびえていた。かつての中世ヨーロッパの森に似ていた。先ほどと同様に、空間には葉書状の物体群がうごめいていた。

 健治は、周りを見回して、ため息をつく。
「またここに来てしまったか……」
 気を取り直して叫ぶ。
「オヤジさん、オヤジさん、どこですか〜?出てきてください!」
 背後から声がした。
「なんだ、誰かと思えばまたお前か」
 振り向くと、小人がいた。身長80センチ位の、小太りでひげを生やし、気難しそうな職人肌の風体だった。西洋の昔の鍛冶職人風の服装をしている。

「あ、オヤジさん。また、力を貸してくれませんか。お願いします」
「またお願いか。なんて言ったかなあ、ほれ、お前の作った女神さん達、彼女らに頼めば良かろう。こんな老いぼれなんか頼らずとも」と、皮肉っぽく言う。
「勘弁してくださいよ。あれは単なるデバッグ支援プログラムで、オヤジさんとは比べ物になりませんよ。オヤジさんだけが頼りなんですから」
 すると、オヤジさんと呼ばれる小人、咳払いをして
「ま、そこまで頼られちゃ、悪い気はしないわな。よし、分かった。任せなさい」と、胸を叩く。
「ありがとうございます。よろしくお願いします」と言いながらお辞儀をする健治。

「おーい、野郎ども、出てこい!」と、オヤジさんが怒鳴ると、
「へーい」と言う声が周りから聞こえてきた。
 すると、オヤジさんと同じような背格好、風体の小人達が数十人、現れ、集まってきた。
「野郎ども、仕事だ。抜かるなよ」と、小人達にハッパをかけ、
「かかれ!」と合図する。
「へーい」
 小人達、一斉に、空間に浮かんだプログラムの化身であるドミノ状に配置した物体に飛び込み、それらと格闘を始める。
 最初、全体が薄いグレーだった物体が、だんだん白い部分が増えていく。同時に残りの部分の色が濃くなる。やがて真っ黒なある一カ所付近を除いて全体が真っ白になった。

 小人達が戻ってくる。
「どうやら、終わったようだな」
 そう言って、オヤジさん、吸っていたキセルの灰を落として立ち上がる。
「分かったんですか?」と、健治が尋ねると、
「まあ、待て」と、オヤジさんが制する。
 小人達が何事か、オヤジさんに報告しているが、よく聞こえない。やがて、
「そうか、分かった。ご苦労だったな。解散!」
 そうオヤジさんが言うと、小人達は、何処へか去っていった。
「オヤジさん」
「大体分かった。あのあたりが怪しいようだ。あの辺を重点的に調べてみるがよかろう」と、持っているキセルで物体の黒い部分を指して説明する。
「やっぱり、あの辺なんですね」
「だが、少し気になる事もある」
「気になる事?」
「うむ、どうやらこれはバグじゃなさそうだ」
「バグじゃない?どういう事ですか?」
「そもそも、バグというのは、プログラマーが意図せずに、紛れ込んだプログラム上の欠陥の事だ」
「はい。では、バグじゃないという事は……」
「そうだ、どうもこれは意図して組込まれた形跡がある」
「だから、バグではないと……」
「悪意なのか、あるいは善意なのか、それは不明だが……いずれにしても、バグを探そうとしても見つからない訳だ。意図的な、プログラマーとしては正しいロジックな訳だからな」
「なるほど……。それでいくら怪しそうなパターンを探しても、見つからなかったのか……」
「その点に気をつけると良かろう……あとはお前さんの仕事だ」

 * * *

 林が、夜になって薄暗い廊下を、健治が作業中の小会議室に向かって歩いていた。
「あ、林チーフ、お先に失礼します」と、声が聞こえた。林、振り向いて、
「おう、お疲れさん」と応え、再び進行方向に向き直して歩き出す。
(あの山田って奴、大丈夫なんだろうな?覗くなって言ってたが、一体、何をやっているんだか……)
 小会議室前に着く。少し考えて、
(ちょっと覗いてみよう。なに、平気だよ)
 ドアノブに手をかけて回してみる。
(えっ、開いてる?不用心だな)
 ドアノブを回し、そっと開きかける。
(気付かれないように、そーっと……って、おいおい、自分の会社で何やってんだか)
 ドアを少し開けて、中を覗き込む。
(どれどれ……)

 健治が、起動中のコンピュータ類の前で、会議机にうつ伏せで眠っているのが見えた。
(おいおい、何だあいつ、寝てるぞ!何をしているかと思ったら、全く……。早速明日、部長に報告しないといけないな)と、心の中で激高する。
 気づかれないようにそっとドアを閉めて、
(くだらない!さっさと帰ろう!)
 そう心の中でつぶやいて、林、立ち去る。

 * * *

 健治は、モニターの光だけの薄暗い小会議室で、会議机にうつ伏せで眠っていた。
 やがて、目を覚まして上体を起こす。
「ん。なんだ?んー、良く寝た」と、伸びをする。
 薄暗い周りを見回して、
「そうか、もう夜か」
 立ち上がって、部屋の電気を付ける。
 明るくなった席に戻って、
「さて、忘れないうちに、一気に片付けてしまいますか」

戦闘開始

 ここはデバッグ仮想空間。先ほどと同じように、プログラムソースが展開されて、空中に漂っている。
「ベル、ウルズ、スクルド、起動!」
 そう健治が叫ぶと、目の前に今度は3つの光が現れ、3人の女神の姿になった。
「お呼びですか、マスター」と、笑顔を見せる3女神。
 そんな女神達を見回して、
「よし、いよいよ実機によるテストラン、およびデバッグを行う。よろしく頼むよ」
「はい、マスター」と、笑顔で応える3女神達。

 彼女達は、健治が作ったデバッグ支援プログラムだ。過去、未来、現在を司る北欧神話の女神にちなみ、ウルズ、スクルド、ベルザンディと名付けた。プログラムの実行を過去に遡って調べたりやり直すウルズ、将来の動きを予測するスクルド、現在の状況を調べたり、分析したりするベルザンディ。いずれもプログラムデバッグに必要な、強力な武器だ。

「よし、まずベル、デバッグビルドしたオブジェクトをターゲットにロードし、デバッグ起動。それから、ゲーム画面を表示して、情報画面をオーバラップ表示だ」
「はい、マスター」
 ベルザンディが応えると、画面が、3D表示のゲーム画面に変わる。別に、デバッグ用の情報画面が半透明のスクリーンとして表示された。
「よし、それでは第13ステージからゲーム開始。ウルズ、スクルドはサポートよろしく。ベル、状況のモニターを」
「はい、マスター」

 * * *

 ゲーム内の仮想3D世界。健治は、ゲームの登場キャラクタの装備をしている。その周りに3女神が半透明にボーッと光って従っていた。
 薄暗い洞窟内を移動していた。M16A2小銃を構えた健治が、女神を伴って移動中。
 突然、スクルドが叫ぶ。
「警告。前方右側の陰から、モンスターが現れます」
 健治、素早く言われた方角に銃を向け、身構える。そこに、予告通り異形のモンスターが現れる。
「出たなっ、妖怪!」
 健治、バースト発射。モンスターを倒す。ほっとして、
「スクルドがいて助かったよ。正直、こういうリアルタイムのゲームは、余り得意じゃないんだよな。この調子で頼むよ」
「はい、マスター。……警告。前方左陰からモンスター……」

 一行は、やがて大空洞に至る洞窟内を移動していた。突然、ベルザンディがしゃべり始める。
「マスター、周りの各種パラメーターが、規定値から外れ始めています。警告、残弾があと1発です。再充填を進言します」
 それを聞いて、あわてて銃のマガジンを交換する健治。続けてスクルドが警告する。
「警告。前方の空洞内に敵多数。火力の増強を進言します」
 健治、驚いて、
「ベル、M203A1グレネードランチャー用意。俺のM16A2に装備しろ」と叫ぶ。
 すると、手持ちの銃が更新された。
「前方の空洞から敵弾多数、来ます。到着まであと5秒。隠れてっ!」と叫ぶスクルド。
 健治、慌てて岩の陰に隠れる。やがて、銃弾の雨が襲来し、女神達を貫く。が、そのまま突き抜け、何事もない。彼女達はこのゲーム世界の存在ではないのだ。
「警告。敵多数、こちらに突撃してきます。視認まで15秒」とスクルドが警告する。
「うわーっ。グレネードランチャー連続発射!」
 健治、洞窟奥の空洞内へ、何度も再充填しつつグレネードランチャーを乱射した。空洞内に爆発音が響き渡る。
「周辺パラメーター、急激に変動中。異常事態です」と、ベルザンディ。
 スクルドが報告する。
「空洞内、敵反応少数。ひとまず危機は脱したようです。いや、何か変です!とりあえず、入り口付近には敵反応はありません。敵の動き、緩慢です」
「そろそろだぞ。ウルズ、ちゃんと付いて来てるか?」と、健治が尋ねると、
「大丈夫です。マスター」と、ウルズが応える。
「じゃ、突入するぞ!」
 一行は、空洞内の動きに注意しながら、前進した。
 空洞内を覗き込むと、ただのゾンビが3体、うごめいていた。
「こんなところに、ゾンビ?」と、拍子抜けして健治が言うと、ベルザンディが警告して言う。
「気をつけてください。あのゾンビは普通ではありません」
「なに!グレネードランチャー発射!」
 空洞奥にいるゾンビ達に向かってグレネードランチャーを発射する。が、起き上がってくる。続けて数回発射するが、効果がない。
「一体、どうなっているんだ?」
「警告。後方からも敵。接近中」と、警告するスクルド。
「なにっ。後ろからも?挟み撃ちかっ」
 振り向くと、洞窟の陰から、ゾンビが現れて来た。
「こっちはどうだ」
 銃弾を後方の敵に数発、打ち込むが、倒れない。ゆっくりと近づいてくる。
「そうか、これが例の無敵キャラなのかっ。ベル、前後の敵や、周りのパラメーターをチェックしろっ」
「はい、マスター」
 スクルドが警告する。
「警告、回避不能です。あと20秒でゲームオーバーです」
 前後から、ゆっくりと、徐々にゾンビ達が近寄ってくる。
「ベル、チェックはまだかっ!まだ終わらないのか」
「もう少しです。終了まで20秒」
「おい、時間が足りないじゃないか。スクルド、もう少し時間を稼げないか?」
「お待ちください。右の凹みに逃げ込めば、あと5秒稼げます」
「よし、何とか間に合いそうだ。いくぞっ!」
 気休めに銃を撃ちながら、くぼみに向かって走る
「終了まであと5秒」と、ベルザンディが報告する。
 周りを包囲しながら、5体のゾンビがゆっくり近づいてくる。
「4、3、2、1、終了しました」
「よし、ブレーク!」と、叫ぶ健治。

 間一髪のところで、ゲーム世界の時間が止まり、健治と女神達以外は停止した。
「ふーっ、何とか間に合った」
 ゾンビ達の間をくぐり抜けて、健治達は空洞の中心部に出る。
「ベル、何か分かったか?」
「はい、マスター。異常なパラメーターのリストを表示します」
 空間に半透明のウインドウが現れ、そこにパラメーターの文字や数字が現れ、流れて表示される。それを読みながら、
「なるほど、そういう事か……。ベル、この辺りで活性化しているソースコードを表示しろ」
「了解です、マスター」
 別の半透明ウインドウが現れ、ソースコードの文字が表示され、流れていく。
 健治、ソースコードを指差しながら、
「よし、ここと、ここ、あと……そう、ここ。これらにブレークポイントを設定。あと、この変数と、このアドレス、あと、このメモリエリアにワッチポイントを設定して、値の更新を知らせろ。ウルズ、この時点まで戻って、再度起動。指示があるまでステップ動作。画面表示はメインをソース表示にして、ゲーム画面はサブに移動。よし、いくぞっ!」

 * * *

 夜の小会議室で、健治がヘッドマウントディスプレイを装着してモニタ画面を見ながら、キーボード操作をしている。
「そうか、ここか。これが問題なんだな」
 キー操作してソース画面をスクロールさせながら、眺めていると、何かに気付いた様子。
「えっ、何だこれは?……そうか、そういう事だったのか……」
 夜は更けて行く……。


[IV. 悲しい真実 へ]

[戻る]


用語解説、コメント(2)

サーバーからダウンロード
サーバーからソースコードなどのデータを取ってくること。
プログラム構造、データ構造解析
プログラムは、それ自身は単なるデータの羅列にすぎない。例えるなら、文字を並べて小説を書くのと同じで、特定の並べ方にすることで、意味のある文章やプログラムにすることが出来る。コンピュータ自身は、単に並べられたプログラムをデータとして逐次、その通り実行するだけなので、結果として意味が通っていれば問題はない。しかし、通常、プログラムは人間が作るので、人間が理解しやすい形式で書いた方が、簡単で理解しやすく、間違いにくい。そのため、通常はプログラムは一定の構造を持って作られる。そのプログラムが扱うデータも同様に構造を持つ。他人の書いたプログラムを理解するには、このプログラム構造、データ構造を解析し、それを作った背景、意味、思想を理解することが大切である。
ブラウジング
目を通すこと、閲覧すること。これをする道具をブラウザという。恐らく、今これを見ているであろうIEなどのソフトも、ブラウザである。特に、ブラウジングのように言う場合には、単に見るだけではなく、検索などの付加価値がついていることが多い。
3人の女神
この名前を見て、既存の別の有名な作品を思い浮かべるかもしれないが、基本的には一切関係ない。オリジナルの北欧神話にちなんで、作中人物がたまたま名付けただけである。ただし、作中人物がその有名な作品のファンで、その名前にちなんで付けた、ということは考えられるかもしれない。でも、あれはキャラクタであり、こちらは単にプログラムの名前である。決してキャラクタ自体のパクリではない。
実機によるテストラン
今回の場合、ソースを書いてコンパイル等の処理をし、実際に動くオブジェクトを作成するマシンと、実際にそのプログラムを動かす機械は、別のものである。そこで、最終的には実際の機械(ゲームマシン)で動かす必要がある。実際に動作する機械のことを、「実機」と呼び、プログラムを実際に動かしてみることを「テストラン(test run)」と呼ぶ。
デバッグビルドしたオブジェクトをターゲットにロードし、デバッグ起動
ソースコードからオブジェクトコードを作成し、実際に動くものにすることを「ビルド(build)」する、あるいは「メイク(make)」すると言う。実際に動くオブジェクトコードには、最終的に製品として出荷する状態のものと、デバッグをしやすくするために、必要な情報を付加させて作成するものと、2種類ある。前者を、リリースビルドしたもの、後者をデバッグビルドしたものと呼ぶ。実際に動作する実機(ターゲット)上にオブジェクトを読み込ませる(ロード)ことを、「ターゲットにロードする」と言う。デバッグビルドしたオブジェクトをデバッガで実行することを「デバッグ起動する」と言う。デバッグ起動したプログラムは、デバッグビルドした際に付加した情報によって、プログラム中で今、どこを実行中か、どういう状態かが分かりやすくなっている。これにより、デバッグ作業が比較的楽になる。
M16A2小銃
種類としては、突撃銃(アサルトライフル)で、ベトナム戦争時に米軍に制式採用されたものの改良型。5.56x45mmの新NATO弾を使用。20発または30発のマガジン(弾倉)を使用(+本体に1発)。射程距離600m以上。M203A1グレネードランチャーを装着可能。
バースト発射
最近の小銃は、引き金を引くと1発づつ撃てるセミオートと、引き金を引き続けると打ち続けるフルオートの2つのモードがある。特に新兵がフルオートで引き金を引き続けると、すぐに玉切れになってしまうことから、1度に3発だけ発射するバーストモードが追加された。 M16A2では、バリエーションによって、セミオート/3点バーストのものと、セミオート/フルオートのものがある。ここで使っているのは、セミオート/3点バーストのもので、一度に3発づつ弾丸が発射される。
M203A1グレネードランチャー
いわゆる手榴弾のような破砕兵器(グレネード)を遠方に射出する摘弾器(ランチャー)の一種。M203A1は、40mmHE弾を、500mもの遠方の目標に当てることが出来る。1発づつ装填、発射する。M16A2などのライフル下部に装着しても使用可能。
ブレーク
プログラムの実行を一時停止させること。通常は、その時点から引き続き再実行が可能。通常、デバッグ時に使用し、プログラムの実行を一時停止させ、その時点での各種状態を確認し、動作が正しいかどうかを判断するために使用する。
活性化している
年々そのサイズが増大しているプログラムも、実行中のある瞬間を考えれば、ごく一部の部分のプログラムが動いているに過ぎないことが多い。これをプログラムの局所性という。CPUのキャッシュメモリが有効なのも、この性質のためである。ここでは、その時点でのプログラムの動いている部分(ワーキングセット)のことを指して、活性化している部分と呼んでいる。活性化している部分を調べれば、今どの部分のプログラムの影響があるかが分かり、デバッグの際の重要なヒントになる。
ブレークポイント
プログラムの実行を一時停止(ブレーク)させるために、あらかじめプログラム中に付けておく印のこと。デバッグ時、プログラムの実行が、その部分にさしかかると、自動的にプログラムは一時停止する。その部分までプログラムの実行がなされた証拠であり、これによってその時点でのプログラム中の各種状態を調べることが出来る。
ワッチポイント
ブレークポイントが、プログラム中の処理の流れを押さえる手段であるのに対し、データの書き換えを押さえるための手段である。ワッチポイントを設定しておくと、プログラムの実行に伴ってその部分のメモリが書き換えられ、更新されると、規定の動作をする。通常はプログラムを一時停止させる。これにより、想定した部分のプログラム以外の部分で、意図せずメモリが書き換えられるという種類のバグを検出することが出来る。
ステップ動作
デバッグ時に、プログラムが一気に流れて処理されるのではなく、段階を追って、順々にプログラムを動かしたいことがある。この動作をステップ動作と呼ぶ。ステップ動作には、そのコンピュータが動作する機械語レベルでのステップ動作から、ソースコードで書かれた命令単位のステップ動作まで、いくつかの段階がある。ソースレベルのステップ動作は、通常、デバッグビルドして必要な情報を付加したオブジェクトコードを使う必要がある。ステップ動作をさせることにより、各ステップで停止した際のプログラム中の各種状態を調べることが出来、デバッグ作業に大いに役立たせることが出来る。


[IV. 悲しい真実 へ]

[戻る]


鎌田勝浩
kamada@kil.co.jp
2005/10/16 初稿