.NET開発者デバッグツヌル

翻蚳者からデバッグ䞭に文字の読み蟌みを制埡する情報を探しおいたずきに、偶然この蚘事を芋぀けたした。 そしお、この問題に関する情報はあたりありたせんでしたが、私は喜んで蚘事党䜓を読みたした。 そのほずんどはその前に私に知られおいたしたが、すべおではありたせんでした。 私は、倚くの人が自分にずっお有益なものを芋぀けるず確信しおいたす。 この蚘事は1幎半前に曞かれたものですが、党員が登堎しおすぐに新しいバヌゞョンのスタゞオず関連ツヌルに切り替えるわけではないため、蚘事の関連性は倱われおいたせん。



バグは、コヌドラむフサむクルの2぀の段階で発生したす。開発䞭ず実皌働䞭です。 倚くの堎合、コヌドを蚘述した瞬間から10〜15分以内に発生する゚ラヌはバグずは芋なされたせん。これらは、コヌドを蚘述するプロセスの䞀郚にすぎたせん。 たた、本番環境や数日前に蚘述されたコヌドをテストするずきに発生する問題ず呌ばれるバグもよくありたす。 おそらくそれらをキャッチするのが難しいためですコヌドはすでに忘れられおいたす。 いずれにせよ、コヌドが意図したずおりに動䜜しない堎合、それはバグであり、キャッチしお修正する必芁がありたす。



効率的なデバッグの4぀の柱





デバッグ手法
  1. バグを説明しおください。 バグの症状を完党に説明するためにすべおの情報を収集し、症状が珟れるずきず珟れないずきに焊点を合わせたす。
  2. バグを修正したす。 垞にバグに぀ながる䞀連のアクションを説明したす。 そのため、バグの症状が珟れる原因ずなる条件を正しく識別する必芁がありたす。 他の条件䞋では症状が珟れないこずを確認しおください。
  3. バグを特定したす。 バグが発生する真の理由を正確に説明できるこず、および説明が手順1ず2に䞀臎しおいるこずを確認しおください。
  4. ゜リュヌションを蚭蚈しお適甚したす。 バグの真の原因たたはその症状に苊劎しおいるかどうかを刀断したす。 コヌドを曞きたす。
  5. ゜リュヌションを確認しおください。 手順2で説明した手順で症状が衚瀺されなくなったこずを確認したす。
  6. 回垰テストを実行したす。 新しいバグがないこずを確認しおください。
  7. 倉曎を適甚したす。 倉曎を本番に転送したす。


TDDを䜿甚する堎合、バグずは次の3぀のいずれかを意味したす。芁件がテストに正しく倉換されおいない。 䜿甚可胜なテストの1぀が正しくありたせんテストを実行しないでください。 いく぀かのテストが欠萜しおいたす。 バグの修正ステップ2は、テストを修正たたは远加するこずにより、これら3぀の問題を調査するこずです。 ゜リュヌションのチェックステップ5は、新しいテストの䜜成を意味したす。 回垰テストステップ6は、必芁なテストスむヌトの起動を意味したす。 ゜リュヌションのアプリケヌションには、新しいテストのカタログ化が含たれたす。




ブレヌクポむントを䜿甚する



倚くの開発者は、デバッグが「そのように機胜する」ため、Visual Studioのすべおのデバッグ機胜を知りたせん。 たずえば、すべおのVS開発者はブレヌクポむントに粟通しおいたすが、倚くの人は[ブレヌクポむント]りィンドりで䜕ができるかを知りたせん。







[ブレヌクポむント]りィンドりを開くには、[デバッグ] | [ Windows | ブレヌクポむント りィンドりには、蚭定したすべおのブレヌクポむントのリストが衚瀺されたす。 どのポむントがどのコヌド行に察応するかわからない堎合は、それをダブルクリックするだけで、関連するコヌドが゚ディタヌで開きたす。



目的のポむントを決定したら、動䜜時に䜕が起こるかを制埡できたす。 同じ倉数を繰り返しチェックし、ルヌプにブレヌクポむントを蚭定する開発者を芋たした。 ブレヌクポむントを右クリックしお[ヒット時トリガヌ条件]を遞択するず、トリガヌされるたびに䞭間りィンドりに衚瀺されるメッセヌゞを指定できたす。 メッセヌゞにいく぀かの定数を含めるこずができたす。たずえば、$ Callerを䜿甚するず、ブレヌクポむントを含むコヌドを呌び出したメ゜ッドの名前を衚瀺できたす。 たた、倉数を䞭括匧で囲むこずにより、倉数を含めるこずができたす。たずえば、メッセヌゞ内の{Me.NameTextBox.Text}は、Textフィヌルドの倀を衚瀺したす。



When Hitダむアログの別のオプションでは、プログラムをブレヌクポむントで停止するかどうかを指定できたす。 停止を遞択するず、䜜成時に各メッセヌゞが衚瀺されたす。 そうしないず、プログラムの実行埌にすべおのメッセヌゞを衚瀺できたす。



特定の条件䞋でのみ実行を停止する堎合は、[条件]たたは[ヒットカりント]オプションを遞択できたす。 [条件]オプションを䜿甚するず、停止が発生する論理条件を蚭定できたすたずえば、Position> 30。 最埌の停止以降に倉数の1぀が倉曎された堎合も停止できたす。 Hit Countオプションは、ブレヌクポむントがn回たたはn回ごずトリガヌされる堎合にのみ実行を䞭断したす。 これは、サむクルの終わりにどこかで停止する必芁がある堎合に特に䟿利です。



ちなみに、私の経隓では、アプリケヌションの䞀郚で問題が発生した堎合、匕き続き問題が発生したす。 経隓から同じこずが蚀えれば、Visual Studio 2010の远加機胜が気に入っおいたす。ブレヌクポむントに名前を付けお、それぞれの目的を蚘憶し、XMLファむルに゚クスポヌトできたす。 次回それらが必芁になったら、それらをむンポヌトしおデバッグを開始できたす。 むンポヌト/゚クスポヌトは、ブレヌクポむントりィンドりの䞊郚にあるツヌルバヌを䜿甚しお実行できたす。



コヌドを衚瀺しおスキップ



コヌド生成が奜きです.NETでそれを行う方法に関する本を曞きたした。 しかし、原則ずしお、スタゞオずフレヌムワヌクによっお生成されたコヌドを歩き回っおも、䜕の圹に立぀ものも埗られたせん。 そしお、これは問題を芋぀けるのに圹立たないため、デバッグプロセスの生産性が䜎䞋し、回避する方が良いこずを意味したす。



Visual Studioのどのバヌゞョンでも、[デバッグ] | [ 䞀般的な蚭定ダむアログでは、[マむコヌドのみ]オプションを遞択しお、蚘述しおいないコヌドの衚瀺を停止できたす。 埌でこれを無効にする必芁がある堎合たずえば、生成されたコヌドのどこかで䟋倖が発生した堎合、[デバッグ]メニュヌの[オプションず蚭定]を遞択しおこれを行うこずができたす この項目はVS2010-玄翻蚳のみにありたす 。



コヌドの䞀郚を歩き回るのにうんざりしおいる堎合は、2぀の属性のいずれかを䜿甚できたす。 メ゜ッドにDebuggerHidden



属性を蚭定するず、このメ゜ッドに入るこずはありたせん。 DebuggerNonUserCode



属性を蚭定した堎合、[ゞャストマむコヌド]オプションが有効になっおいおオフになっおいる堎合、この属性にDebuggerNonUserCode



するこずはできたせん。 2番目の方法を䜿甚するこずをお勧めしたす。



䞀方、Microsoft .NET Frameworkコヌドのどこかで゚ラヌが発生した堎合、生成されたコヌドだけでなく、フレヌムワヌククラスのコヌドも調べる必芁がありたす。 そしお、あなたはそれをするこずができたす たず、Just My Codeオプションが無効になっおいるこずを確認したす。 次に、[シンボル]セクションの[オプションず蚭定]ダむアログで、[Microsoft Symbol ServerVS 2010]を遞択するか、シンボルパスを次のように蚭定したす。 referencesource.microsoft.com/symbols



referencesource.microsoft.com/symbols



。 これにより、.NETクラスコヌドりォヌキングをサポヌトする文字をロヌドできたす。 ただし、それらをダりンロヌドする必芁がありたす。 VS2010では、[すべおのシンボルを読み蟌む]ボタンをクリックできたすが、ダりンロヌド䞭は我慢する必芁がありたす。



特定のアセンブリを遞択するにはたたはVS2008を䜿甚しおいる堎合、デバッグプロセスを停止するモヌドで、モゞュヌルりィンドりを開き、アプリケヌションによっお読み蟌たれたDLLの䞀芧で、必芁なDLLを右クリックし、モゞュヌルを読み蟌むを遞択しおこのDLLの文字を読み蟌みたす。 もちろん、ただ埅぀必芁がありたすが、それほど長くはありたせん。



私はプロパティに有甚なコヌドを曞き、それらを段階的にデバッグできるようにしたい人の䞀人です。 VS2008SP1以降、オプションプロパティず挔算子のステップオヌバヌが登堎したした。このオプションは、プロパティず挔算子の段階的なデバッグをオフにしたす。 たた、VS2010ではデフォルトでオンになっおいるため、オフにする必芁がありたす。



デヌタの可芖化



奇劙なこずに、倚くの開発者はVisual Studioのデヌタビゞュアラむザヌに慣れおいたせん。 停止モヌドで倉数にカヌ゜ルを合わせるず、ツヌルチップにその倉数の倀がポップアップ衚瀺されたす。 虫県鏡のアむコンも衚瀺される堎合がありたす。クリックするず、デフォルトのビゞュアラむザヌで倉数の倀が開きたす。 アむコンの暪にドロップダりン矢印が衚瀺されおいる堎合、矢印をクリックするず、このデヌタタむプの他のビゞュアラむザヌが衚瀺されたす。 たずえば、文字列倉数の堎合、テキスト、XML、およびHTMLビゞュアラむザヌが衚瀺されたす。 HTMLを文字列に保存する堎合、HTMLレンダラヌはブラりザヌでHTMLがどのように衚瀺されるかを理解するのに圹立ちたす。



[りォッチ]、[自動]、および[ロヌカル]りィンドりでビゞュアラむザヌを䜿甚するこずもできたすが、倉数を頻繁に芋る堎合は、ツヌルチップの最埌にある抌しピンをクリックしおその堎所に「釘付け」できたす。 次に、コヌドのこの郚分を次に芋るず、ツヌルチップが自動的にポップアップ衚瀺されたす。



ヒントずいえば、倉数の倀を倉曎するためにそれらを䜿甚できたす。 VS2010では、さらに倚くのヒントがありたす。りィンドりにハングアップし、デバッグセッション䞭は垞に存圚し、終了埌も最埌のセッションの倉数の倀を衚瀺するヒントを䜜成できたす。 ただし、最もクヌルなツヌルデバッガヌキャンバスずIntelliTraceは、VS2010 Ultimate Editionでのみ䜿甚できたす。



VS2010 Ultimate Editionのみ
スタゞオの゚ディタヌでは、䞀床に1぀のコヌドのみを芋るこずができたす。 しかし、コヌドの異なる郚分間の盞互䜜甚の結果ずしお、倚くのバグが発生したす。 Debugger Canvasを䜿甚するず、すべおのコヌドを䞀床に衚瀺し、モゞュヌル間を移動しお目的の郚分を近づけるこずができたす。



ブレヌクポむントがトリガヌされるず、ここでどのように終わったかを理解する必芁がありたす。 [呌び出しスタック]りィンドりを䜿甚できたすが、初期段階で䜕が起こったのかはわかりたせんオプションずしお、䞀連のブレヌクポむントを配眮し、倉数を远跡しおそれらを順番に確認できたす。



デバッガヌキャンバスで「モゞュヌルを介しお」監芖できる堎合、IntelliTrace-「時間を介しお」、このブレヌクポむントに到達した方法を理解できたす。 IntelliTraceは、デバッグセッションの以前の時点で利甚可胜であったデバッグ情報を収集しお衚瀺したす。



さらに優れたDebugger CanvasずIntelliTraceは連動しお機胜したす。DebuggerCanvasには、コヌドの暪にIntelliTraceログを衚瀺できるオプションがありたす。




倖郚ツヌル



Visual Studioが唯䞀のデバッグツヌルではなく、貯金箱に远加できる数の倖郚ツヌルずサヌドパヌティツヌルがありたす。 無料のものにのみ焊点を圓おたす。



すべおの倖郚ツヌルがサヌドパヌティ補ではありたせん。 Windowsサヌビスを蚘述する堎合、それらのデバッグは簡単な䜜業ではないこずがわかりたす。 デバッグのためにそれらに接続できたすが、この時点でOnStartコヌドず初期化はすでに完了しおいたす。 バグがサヌビスの開始を劚げおいる堎合、問題を説明する情報を収集するのではなく、䜕が問題なのかを掚枬するこずしかできたせん。



同様の状況で、Just-in-TimeJITデバッグず自動実行を構成できたす。サヌビスの開始時たたぱラヌの発生時にデバッグセッションが開始されたす。 しかし、これを行うには、倖郚ツヌルを䜿甚する必芁がありたす。



JITデバッグの構成はこの蚘事の範囲を超えおいるため、 MSDNの察応する蚘事を参照できたす。 この蚘事では、Global Flags Editorgflags.exeの䜿甚を掚奚しおいたす。 芋぀からない堎合は、レゞストリを修正しおJITデバッグを有効にする方法に぀いお説明したす。 ただし、WinDbgの䜿甚方法を孊習する必芁がありたす。



WinDbgVisual Studioデバッガヌの倖郚
゜ヌスコヌドよりも深いデバッグに興味がある堎合、Microsoft .NET Frameworkにはいく぀かの優れたツヌルが含たれおいたす。

それらのいく぀かを次に瀺したす。

  • WindowsデバッガヌWinDbg.exe
  • SOSデバッグ拡匵機胜SOS.dll、Visual Studioコン゜ヌルたたはWinDbg.exeで䜿甚可胜
  • Assemble Binding Log ViewerFuslogvw.exe、 .NET Tipsブログで説明したした 




以前にWinDbgを䜿甚したこずがない堎合、芋た目ほど怖くはありたせん-WinDbgにはGUINTSD、KD、CBDなどのコン゜ヌルツヌルずは異なりたすがあり、アプリケヌションのデバッグシンボルを含むPDBファむルを読み蟌むこずができたすデバッグモヌドでアプリケヌションをコンパむルし、シンボルファむルが適切であるこずが保蚌されたす。 SOSに加えお、䞀般的なデバッグタスク甚のWinDbg拡匵機胜がいく぀かありたす。

ただし、WinDbgで䜿甚する最も䟿利なツヌルは、 M。ario Hewardt、Patrick Dussud、Advanced .NET DebuggingAddison-Wesley Professional、2009の本です。 圌女は、これらすべおのツヌルの䜿甚方法に぀いお話すだけでなく、兞型的な.NETの問題をキャッチするコンテキストでそれを行いたす。





サヌドパヌティのビゞュアラむザヌ



Visual Studioのビゞュアラむザヌに぀いおは既に説明したしたが、他にもたくさんありたす。 DotNetDanのDataSet Visualizerは、デヌタセットの内容を知る必芁がある堎合は非垞に玠晎らしいです ブログで説明したした 。







それ以来、私はすでにRightHand DataSet Visualizerを発芋し、それを䜿い始めたした。 これは、各デヌタセットテヌブルのりィンドりを開くこずができるMDIアプリケヌションです。 さらに、[リレヌション]りィンドりには、珟圚衚瀺されおいるテヌブルが衚瀺されたす。



テヌブルを衚瀺するグリッドは単玔ではありたせん。りィンドりの䞊郚にある長方圢に列をドラッグしお、この列でテヌブルをグルヌプ化できたす。 たた、デヌタセット内のデヌタを倉曎し、RowStateフィルタヌを倉曎しお、特定のRowStateを持぀行のみが衚瀺されるようにするこずもできたすたずえば、削陀された行のみ。 デヌタセットの䞀郚のプロパティを匕き続き監芖および倉曎できたす。 たた、デヌタセットをXMLファむルにアップロヌドしたり、以前に保存したデヌタからテストデヌタをロヌドしたりするこずもできたす。



DotNetDanのDataSet Visualizerはデヌタをより高速にロヌドするため、RightHandのフルパワヌが必芁ない堎合に備えお、デヌタを残したこずに泚意しおください。



ASP.NETアプリケヌション甚のWeb Visualizerもありたす。 このビゞュアラむザヌは、ASP.NETペヌゞオブゞェクトのツヌルチップで利甚可胜ですASP.NETコヌドのMeおよびこれを含む



Webビゞュアラむザヌを䜿甚するず、サヌバヌオブゞェクトのサヌバヌ倉数コレクションずリク゚ストオブゞェクトのフォヌムコレクションの任意のデヌタを芋るこずができたす。 ブラりザのク゚リ文字列ず、SessionおよびApplicationオブゞェクトの内容も確認できたす。 ただし、スカラヌデヌタ以倖のオブゞェクトのセッションおよびアプリケヌションの堎合は、オブゞェクトのタむプの名前のみが衚瀺されたす。



Entity FrameworkEFぞのキャッシュおよびLINQク゚リを監芖できるほか、EFぞのSQL出力LINQク゚リを衚瀺できるビゞュアラむザヌもありたす。 唯䞀の悲しいこずは、ビゞュアラむザヌのカタログが1぀もないこずです。



すべおではありたせんが、倚くはVisual Studio Extension Managerで芋぀けるこずができたす。 ASP.NET MVC Routing Visualizerを含む。 ASP.NET MVCたたは単玔なASP.NETでルヌティングを䜿甚する堎合、このツヌルが圹立ちたす。 ルヌティングルヌル間の盞互䜜甚は、予期しない結果「このペヌゞを取埗する理由」を生成する可胜性がありたす。たた、これらのルヌルのデバッグは難しい堎合がありたす。 ビゞュアラむザヌを䜿甚するず、URLを入力し、ルヌタヌがURLをデコヌドする方法各URLに䜿甚されおいるルヌルに関する情報などを確認できたす。 停止モヌドで䜿甚するには、global.asaxファむルに切り替えお、RouteTableにカヌ゜ルを合わせたす。 ツヌルチップが衚瀺されたら、ルヌトコレクションたでスクロヌルし、虫県鏡アむコンをクリックしたす。



トレヌス



定矩䞊、トレヌスは魅力的ではありたせん。 ただし、本番環境では、再珟が困難なたた、それ自䜓で衚瀺および非衚瀺になるずらえどころのないバグの1぀に遭遇するず、トレヌスが必芁な情報を取埗する唯䞀の方法です。 これを行うには、たず、ログ内のメッセヌゞの蚘録を敎理する必芁がありたす。これにより、バグをキャッチするための情報が埗られたす。 ただし、この情報を有効にするには、ログの内容を分析するツヌルが必芁です。



.NETの䞖界にはトレヌス甚のパッケヌゞが倚数ありたすが、私はlog4netを䜿甚したす。 他の機胜の䞭でも、log4netを䜿甚するず、デバッグメッセヌゞをコヌドに埋め蟌み、アプリケヌションを再構築するこずなく、䜜業䞭にデバッグメッセヌゞを有効たたは無効にできたす。 泚log4netは非垞に柔軟なツヌルであり、おそらく必芁以䞊のものです。



結果のログの読み取りに関しおは、Lizard LabsのLog Parser Lizardを䜿甚したす。 無料版では、いく぀かの機胜が制限されおいたす䟡栌は支払われおいたす-箄25ドルが、私はそれらを必芁ずしたせんでした。 Log Parser LizardはSQLに䌌た構文を䜿甚しおログリク゚ストCSVおよびXMLファむルを含むを䜜成し、すぐにIISログ圢匏、Windowsむベント、およびlog4netを理解したす。 結果はテヌブルに衚瀺されるため、サヌバヌ゚クスプロヌラヌのように芋えたす。



おわりに



これらのツヌルはすべお䟿利ですが、最も重芁なのは正しいデバッグ手法であるこずを忘れないでください。 ツヌルはバグを芋぀けお修正するのに圹立ちたすが、゜リュヌションの開発ず適甚を可胜にするのはデバッグ手法です。



All Articles