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

** 環境
Ubuntu Linux server 12.04 or later

* 準備

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

 # apt-get install gdb

* 診断

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

内容は例えばこんな感じ。
- http://lazy-life.ddo.jp:8080/morgue/dplusplus/crash-dplusplus-20150401-143149.txt

 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"])),    # ←ここを修正

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

 Player stats                               Other player related effects
 A      set all skills to level             c      card effect
 Ctrl-D change enchantments/durations       Ctrl-G save/load ghost (bones file)
 g      exercise a skill                    h/H    heal yourself (super-Heal)
 l      change experience level             e      set hunger state
 Ctrl-P list props                          X      make Xom do something now
 r      change character's species          z      cast spell by number/name
 s      gain 20000 skill points             !      memorise spell
 S      set skill to level                  W      god wrath
 x      gain an experience level            w      god mollification
 $      get 1000 gold                       p      polymorph into a form
 n      lose all gold                       V      toggle xray vision
 ]      get a mutation
 _      gain religion                       Monster related commands
 ^      set piety to a value                D      detect all monsters
 @      set Str Int Dex                     G      dismiss all monsters
 #      load character from a dump file     m/M    create monster by name/number
 Ctrl-Z gain lots of Zot Points             "      list monsters
 &      list all divine followers
 =      show info about skill points        Item related commands
                                            a      acquirement
 Create level features                      C      (un)curse item
 L      place a vault by name               i/I    identify/unidentify inventory
 T      make a trap                         y/Y    id/unid item types+level items
 ,/.    create up/down staircase            o/%    create an object
 (      turn cell into feature              t      tweak object properties
 \      make a shop                         v      show gold value of an item
 Ctrl-K mark all vaults as unused           -      get a god gift
                                            |      create all unrand artefacts
 Other level related commands               +      make randart from item
 Ctrl-A generate new Abyss area             '      list items
 b      controlled blink                    J      Jiyva off-level sacrifice
 B      controlled teleport
 Ctrl-B banish yourself to the Abyss        Debugging commands
 k      shift section of a labyrinth        f      quick fight simulation
 R      change monster spawn rate           F      single scale fsim
 Ctrl-S change Abyss speed                  Ctrl-F double scale fsim
 u/d    shift up/down one level             Ctrl-I item generation stats
 ~      go to a specific level              O      measure exploration time
 :      find branches and overflow          Ctrl-T dungeon (D)Lua interpreter
        temples in the dungeon              Ctrl-U client (C)Lua interpreter
 ;      list known levels and counters      Ctrl-X Xom effect stats
 {      magic mapping                       Ctrl-Q make some debug messages quiet
 }      detect all traps on level           Ctrl-C force a crash
 Ctrl-W change Shoals' tide speed
 Ctrl-E dump level builder information      Other wizard commands
 Ctrl-R regenerate current level            (not prefixed with &!)
 P      create a level based on a vault     x?     list targeted commands
                                            X?     list map-mode commands

 プレイヤー能力値:                          その他のプレイヤーに関する効果:
 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?     フロアマップコマンドを列挙する

* 関連リンク

- RAT portal: gcc+gdbによるプログラムのデバッグ ~
http://rat.cis.k.hosei.ac.jp/article/devel/debugongccgdb1.html

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS