DCSSを遊んでいてゲームがクラッシュした! 原因はなに? といった場合の手引き。

環境

Ubuntu Linux server 12.04 or later

準備

依存ツール・ライブラリの導入

# apt-get install gdb

診断

クラッシュダンプを見る

クラッシュ時のメッセージウィンドウやサーバログにクラッシュダンプの場所が示されるのでまずはそれを見ます。

内容は例えばこんな感じ。

Obtained 14 stack frames.
./crawl(_Z17write_stack_traceP8_IO_FILEi+0x23) [0x592533]: write_stack_trace(_IO_FILE*, int)
./crawl(_Z13do_crash_dumpv+0x362) [0x59c0d2]: do_crash_dump()
./crawl(_Z20crash_signal_handleri+0x9c) [0x5927dc]: crash_signal_handler(int)
/lib/x86_64-linux-gnu/libc.so.6(+0x36150) [0x7fe7a1f89150]: 
/lib/x86_64-linux-gnu/libpthread.so.0(raise+0x2b) [0x7fe7a2321b7b]: 
./crawl() [0x59b829]
./crawl() [0x59bc28]
./crawl(_Z12you_can_wear14equipment_typeb+0x56a) [0x96412a]: you_can_wear(equipment_type, bool)
./crawl(_Z10puton_ringib+0x1c4) [0x719294]: puton_ring(int, bool)
./crawl(_Z15process_command12command_type+0x1f5) [0x7b8fc5]: process_command(command_type)
./crawl() [0x7bc0c9]
./crawl(main+0x815) [0x7c00a5]: 
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed) [0x7fe7a1f7476d]: 
./crawl() [0x4e7619]

you_can_wear()あたりで何かが起きて死んだ事が予想されます。

デバッガを使う

大体の場所が分かっても詳細な原因がつかめない事が多いので、素直にデバッガの力を借ります。

% make WEBTILES=y SAVEDIR=saves debug
% gdb ./crawl

デバッグビルドを行い、デバッガを起動します。

(gdb) b you_can_wear

でyou_can_wear()関数の頭にブレークポイントが設定されます。(b はbreakコマンドの略記法)
もうちょっと詳細に設定したい場合は

(gdb) b player.cc:698

のようにファイル名と行数を指定します。

runコマンドでコンソール画面のDCSSが起動します。最低限-nameオプションと-rcオプションを付けていればよいです。
(sprintで動かしたい場合は -sprintオプション)

(gdb) run -name hoge -rc rcs/hoge.rc

ゲームを操作してプログラムの処理がブレークポイントの設定箇所にさしかかるとゲームが中断し、ステップ実行モードに入ります。
後はnext(nで略記可能)、stepコマンドで処理を追いかけてクラッシュする箇所を見つければほぼ解決です。

gdbの詳細な使い方の解説については他のwebサイトに譲ります。

ウィザードモード

実際の動作を試してみたいが実プレイで状況を再現するのはきつい、そんな時のためのウィザードモードです。

ウィザードモードが有効になっているバイナリである必要があるのでコンパイルオプションから指定します。

% make WEBTILES=y WIZARD=y SAVEDIR=saves debug

オプションで-wizardを指定して起動します。

% ./crawl -name hoge -rc hoge.rc -wizard

Webtile上でwizard modeを有効にしたい場合は

ウィザードモード有効にしてコンパイルした後、webserver/config.pyを以下のように書き換えるとウィザードコマンドがブラウザ上から使えるようになります。

   ("dcss-web-trunk", dict(
        name = "DCSS trunk",
        crawl_binary = "./crawl",
        rcfile_path = "./rcs/",
        macro_path = "./rcs/",
        morgue_path = "./rcs/%n",
        inprogress_path = "./rcs/running",
        ttyrec_path = "./rcs/ttyrecs/%n",
        socket_path = "./rcs",
        client_path = "./webserver/game_data/",
        morgue_url = None,
        send_json_options = True,   # ←ここと
        options = ["-wizard"])),    # ←ここを修正

ゲーム中に '&' キーの後にコマンドを続けることで様々な操作ができます。 & ?でヘルプが表示されます。

プレイヤー能力値:                          その他のプレイヤーに関する効果:
A      すべてのスキルを指定値まで上げる    c      カードを引く効果
Ctrl-D 持続効果を変更する                  Ctrl-G bonesファイルから幽霊を
g      スキルを鍛える                             読み書きする
l      経験レベルを変更する                h/H    自身を回復させる
Ctrl-P プロパティを列挙する                e      満腹度を変更する
r      プレイヤー種族を変更する            X      ゾムに何かをさせる
s      20000スキルポイントを得る           z      名前/番号を指定して魔法を使う
S      スキルを指定値に設定する            !      魔法を習得する
x      経験レベルを1上げる                 W      神の怒りを落とす
$      1000ゴールド得る                    w      神の怒りをなだめる
n      所持金をすべて失う                  p      さまざまな姿に変わる
]      突然変異を得る                      V      壁透視の切り替え
_      指定した神を信仰する                
^      信仰値を変更する                    モンスター関連コマンド:
@      腕力/知力/器用を変更する            D      全てのモンスターを感知する
#      ダンプファイルからキャラクターを    G      モンスターを消す
       読み込む                            m/M    名前または番号を指定して
Ctrl-Z 多くのゾットポイントを得る                 モンスターを生成する
&      神聖なる従者をすべて列挙する        "      モンスターを列挙する
=      スキルポイントの情報を得る          
                                           アイテム関連コマンド:
階層の要素を編集する:                      a      獲得の効果
L      名前を指定してvaultを生成する       C      アイテムを呪う/呪いを解く
T      罠を張る                            i      所持アイテム全部を鑑定する
,/.    上り/下り階段を生成する             I      所持アイテム全部を未鑑定にする
(      このマスを別の地形に変える          y      アイテム全部を鑑定する
\      店を生成する                        Y      アイテム全部を未鑑定にする
Ctrl-K すべてのvaultを未使用扱いにする     o/%    オブジェクトを生成する
                                           t      オブジェクトの設定値を変更する
その他の階層関連コマンド:                  v      アイテムの価値を表示する
Ctrl-A 新たなアビスの領域を生成する        -      神の授かり物を得る
b      行き先を制御しての瞬間移動          |      全ての固定★を生成する
B      行き先を制御してのテレポート        +      アイテムをベースに☆を生成する
Ctrl-B 自らをアビスに追放する              '      アイテムを列挙する
k      ラビリンスの区域を変更する          J      別の階層にあるアイテムを
R      モンスターの生成率を変更する               ジーヴァに捧げる
Ctrl-S アビスの変容速度を変更する          
u/d    1階上/下へ移動する                  デバッグ用コマンド:
~      分岐やポータルに移動する            f      簡易戦闘シミュレーション
:      分岐や寺院外の祭壇の場所を表示する  F      fsim(シングルスケール)
;      既知の階層とカウンターを表示する    Ctrl-F fsim(ダブルスケール)
{      魔法の地図の効果                    Ctrl-I アイテム生成統計を出す
}      階層のすべての罠を感知する          O      探索ターンを計測する
Ctrl-W 浅瀬における潮の速度を変更する      Ctrl-T (D)Luaインタプリタ
Ctrl-E 階層構築情報を表示する              Ctrl-U (C)Luaインタプリタ
Ctrl-R 現在の階層を再構成する              Ctrl-X ゾム効果の統計を出す
P      指定したvaultをもとに階層を作成する Ctrl-Q デバッグメッセージを切る
                                           Ctrl-C 強制的にクラッシュさせる
                                           
                                           その他のウィザードコマンド:
                                           ('&'を頭に付けない!)
                                           x?     照準コマンドを列挙する
                                           X?     フロアマップコマンドを列挙する

関連リンク


Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup Referer   Help   RSS of recent changes
Last-modified: Sun, 23 Aug 2015 23:03:09 JST (580d)