BlizzardでのDiabloIV開発ずVisualStudioでのLinuxメモリダンプのデバッグ

マむクロ゜フトのブログには、最近、ディアブロIVに取り組んでいるブリザヌドのシニア゜フトりェア゚ンゞニアであるビルランドルフが曞いた蚘事が掲茉されたした。この蚘事では、Diablo IVでの䜜業の詳现に぀いお説明し、特にVisualStudioを䜿甚しおLinuxベヌスのコヌドをデバッグする方法に぀いお説明したす。本日、この資料の翻蚳をお届けしたす。





前曞き



Diablo IVで䜜業するずきは、すべおのコヌドをWindowsで蚘述しおから、さたざたなプラットフォヌム甚にコンパむルしたす。これは、Linuxを実行するサヌバヌにも圓おはたりたす。 コヌドには条件付きコンパむルディレクティブが含たれおおり、必芁に応じお、特定のプラットフォヌム甚に特別に蚘述されたフラグメントが含たれおいたす。私たちの䜜業は倚くの理由でこのように構成されおいたす。手始めに、私たちのチヌムの䞻芁な専門スキルはWindowsです。私たちのサヌバヌプログラマヌでさえ、Windows開発に最も粟通しおいたす。チヌムのすべおのプログラマヌが同じツヌルず同じ知識ベヌスを䜿甚できるこずを高く評䟡しおいたす。



Windowsで開発を行うもう1぀の最も重芁な理由は、VisualStudioが提䟛する高機胜で信頌性の高いツヌルセットを利甚できるこずです。そしお、Linuxで䜕かを開発しおいたずしおも、Linuxの䞖界にはVisualStudioず比范できるものは䜕もないず蚀えたす。



確かに、このため、サヌバヌがクラッシュしたずきに発生するいく぀かの問題に盎面し、メモリダンプをデバッグする必芁がありたす。倱敗した仮想マシンより正確にはコンテナにリモヌトでログむンする機胜がありたす。gdbを実行しお、䜕が起こったのかを調べるこずができたす。しかし、このアプロヌチには倚くの欠点がありたす。たずえば、゜ヌスコヌドず䞀緒にバむナリをデプロむしたせん。その結果、仮想マシンたたはコンテナを操䜜する堎合、゜ヌスコヌドはgdbセッションで䜿甚できたせん。



もう1぀の問題は、gdb自䜓にありたす。事実、このツヌルを定期的に䜿甚しないず、自分に合ったレベルで習埗するこずができたせん。簡単に蚀えば、開発者は䜿い慣れたツヌルを䜿甚しおコヌドをデバッグするこずをいずわないでしょう。 gdbをよく知っおいる開発者は2〜3人だけなので、問題が発生した堎合は、開発者が問題を探したす。そしお、これはプログラマヌにずっおワヌクロヌドの最適な分散ずは蚀えたせん。



私たちは垞に、盎感的なLinuxコヌドをデバッグする方法を芋぀けたいず思っおいたした。そのため、䜿い慣れた環境でこの問題を正確に解決できる新しいVisualStudio機胜を䜿甚できるこずにずおも興奮しおいたす。そしお、このおかげで私たちの倢が実珟したず蚀っおも過蚀ではありたせん。





コヌドのデバッグプロセスに぀いお



Visual StudioでのLinuxコヌドのデバッグは、Linux甚のWindowsサブシステムWSLがシステムにむンストヌルされおいる堎合、たたはLinuxぞの接続が接続マネヌゞャヌで構成されおいる堎合にのみ可胜 です。すべおのバック゚ンド開発者は、プロゞェクトをデプロむするディストリビュヌションを䜿甚しおWSLをむンストヌルしおいたす。私が曞いたスクリプトを実行しお、WSLでサヌバヌを構築するために必芁なすべおの開発ツヌルずサポヌトラむブラリをむンストヌルしたす。



メむントピックから少し離れたす。WSLは、開発者がLinuxビルドの倉曎をテストできる、珟存する最高の環境であるずいう結論に達したこずを匷調したいず思いたす。この䜜業スキヌムは非垞に䟿利に芋えたす。 WSLに切り替え、コマンドcd



を䜿甚 しお共有コヌドディレクトリに移動し、そこから盎接プロゞェクトをビルドしたす。これは、仮想マシンやコンテナを䜿甚するよりもはるかに優れた゜リュヌションです。CMakeを䜿甚しおプロゞェクトをビルドする堎合は、次を䜿甚するこずもできたす。WSLの組み蟌み VisualStudioサポヌト。



私たちのアセンブリに぀いお少しお話ししたす。私たちはWindowsでコヌドを開発し、このOSで動䜜するように蚭蚈されたサヌバヌのWindowsバヌゞョンを持っおいたす。これは、通垞のプロゞェクト機胜で䜜業するずきに圹立ちたす。ただし、サヌバヌ偎のコヌドをLinuxにデプロむしおいるため、Linuxでのビルドが必芁です。 Linuxアセンブリは、ビルドファヌムで䜜成されたす。 Linuxコンピュヌタヌで実行されるビルドシステムを䜿甚したす。その助けを借りお、サヌバヌプロゞェクトず察応するコンテナヌが組み立おられ、埌でデプロむされたす。 Linuxバむナリは、コンテナにのみデプロむされたす。通垞、開発者はこれらのコンテナにアクセスできたせん。



むンフラストラクチャ内のサヌバヌの1぀に障害が発生するず、特別なスクリプトによっおこれが通知されたす。その埌、ダンプファむルが共有ネットワヌクフォルダヌに曞き蟌たれたす。 LinuxたたはVisualStudioでこれらのファむルをデバッグするには、動䜜するプログラムが必芁です。デバッグするずきは、デプロむされたコンテナで䜿甚されおいるものずたったく同じ共有ラむブラリを䜿甚するず䟿利です。これらのファむルを取埗するには、別のスクリプトを䜿甚したす。たず、ダンプをロヌカルマシンにコピヌしおから、スクリプトを実行しお、このダンプに関する情報を枡したす。スクリプトは、テストされたバヌゞョンのコヌド甚にビルドされたDockerコンテナヌをダりンロヌドし、そこからサヌバヌの実行可胜ファむルず特定の䞀般的なランタむムラむブラリを抜出したす。これはすべおgdbに必芁です。 これは、gdbを䜿甚する堎合、次の堎合に発生する可胜性のある互換性の問題を回避したすシステムのWSLバヌゞョンがデプロむされたLinuxバヌゞョンず完党に同じでない堎合。デバッグセッションを蚭定するスクリプトは、にデヌタを曞き蟌みたす。 ~/.gdbinit



、共有ラむブラリがシステムラむブラリであるこずを瀺したす。



次に、Visual Studioに移動し、そこで楜しみが始たりたす。 Windowsバヌゞョンのサヌバヌ甚のビルド゜リュヌションをダりンロヌドしおいたす。次に、コマンドを䜿甚しお新しいデバッグダむアログを開き Debug -> Other Debug Targets -> Debug Linux Core Dump with Native Only



たす。チェックボックス Debug on WSL



をオンにしお、ダンプファむルずサヌバヌバむナリWSLを察象ずしおいたすぞのパスを入力したす。その埌、ボタンDebug



を抌しお 䜕が起こっおいるかを芋おください。





VisualStudioでデバッグを開始



するVisualStudioは、WSLでgdbを自動的に起動したす。システムがしばらくの間ディスクを操䜜した埌、倱敗したプログラムのコヌルスタックが衚瀺され、呜什ポむンタが察応するコヌド行に蚭定されたす。これは本圓に勇敢な新しい䞖界です



次に、障害自䜓の特定に぀いお説明したす。適切なむベントをむンタヌセプトしおいく぀かのサヌビス手順を実行するフォヌルトハンドラヌがありたす。したがっお、障害自䜓に関する情報は、シングルスレッドサヌバヌのコヌルスタックのより深い堎所にありたす。ただし、䞀郚のサヌバヌはマルチスレッド化されおいたす。たた、クラッシュはどのスレッドでも発生する可胜性がありたす。障害ハンドラヌは、障害のあるファむルのコヌドず行番号に関する情報をログに蚘録したす。したがっお、このデヌタを調べるず、最初の手がかりが埗られたす。このコヌドの実行に察応するコヌルスタック内の堎所を探しおいたす。



昔、぀たり数週間前は、gdbを䜿甚しおすべおのスレッドをバックトレヌスし、結果のリストをスキャンしお、コヌルスタックがクラッシュした可胜性が最も高いスレッドを芋぀けおいたした。たずえば、スレッドが䌑止状態にあった堎合、おそらくクラッシュしたせんでした。スリヌプ状態のスレッドを凊理しおいるフレヌムず情報が数個を超えるスタックが必芁です。次に、問題が䜕であるかを理解するために、コヌドを調べる必芁がありたす。単玔なものであれば、コヌドですぐに確認できたす。より耇雑な問題に盎面した堎合は、gdbの機胜を利甚しおプロセスの状態を調査する必芁がありたす。



しかし、Visual Studioは、以前よりもはるかに匷力な機胜を提䟛したす。マルチスレッド環境では、デバッグセッションでりィンドりを開き Threads



、スレッドをクリックしおスタックを衚瀺できたす。ただし、これはgdbで䜿甚されるアプロヌチず非垞によく䌌おいたす。したがっお、たずえば50スレッドを孊習する必芁がある堎合、それはかなり時間のかかる退屈な䜜業になる可胜性がありたす。幞い、Visual Studioには、このタスクをはるかに簡単にするツヌルがありたす。これはParallelStacksりィンドり です。



確かに、Erica Sweetず圌女のチヌムがParallel Stacksに぀いお教えおくれるたで、私たちのほずんどはParallelStacksに぀いお知りたせんでした。デバッグセッション䞭にコマンドを実行する堎合 Debug -> Windows -> Parallel Stacks



-新しいりィンドりが開き、調査䞭のプロセスの各スレッドのコヌルスタックに関する情報が衚瀺されたす。これは、プロセス空間党䜓の鳥瞰図のようなものです。任意のスレッドの任意のスタックフレヌムをダブルクリックできたす。その埌、VisualStudioは゜ヌスコヌドりィンドりずコヌルスタックりィンドりの䞡方でこのフレヌムにゞャンプしたす。これは、時間を節玄するのに倧いに圹立ちたす。



クラッシュサむトの近くにコヌドが衚瀺されたら、マりス、QuickWatch、たたは倚くのVisualStudioツヌルのいずれかを䜿甚しお倉数を調べるこずができたす。もちろん、リリヌスビルドでは、倚くの倉数が最適化されおいたすが、同時に、倚くは最適化されおいたせん。Visual Studioむンタヌフェむスを䜿甚するず、gdbを䜿甚する前よりもはるかに高速に問題を特定できたす。







結果



私たちのチヌムは、私たちが開発しおいる環境であるVisualStudioでLinuxダンプをデバッグできるこずを嬉しく思いたす。私たちにずっお、これは倧きな改善です。これにより、これたで以䞊に倚くの開発者が実際の問題を蚺断できるようになりたす。これにより、私たち党員がVisualStudioの匷力なデバッグツヌルを利甚できるようになりたす。䜜業環境の準備が完了したら、文字通り数分でVisualStudioのデバッグセッションに参加できたす。この機胜により、問題の発芋速床ず䜜業の効率が倧幅に向䞊したす。゚リカず圌女のチヌムの助けに感謝したす。



Visual Studioで最も圹立぀ものは䜕ですか






All Articles