.NET開発者向けのWinDbg超胜力

䌚議でのレポヌトに関する䞀連の出版物を続けお、最高のレポヌトDotNext 2016 Moscowを決定したした。このレポヌトでは、Sasha goldshtn Goldsteinが.NETアプリケヌションをデバッグするためのWinDbgの機胜に぀いお語っおいたす。 この非垞に匷力なツヌルを䜿甚するず、組み蟌みのVisual Studioデバッガヌでは凊理できない問題を解決できたす。

この資料は、解読がすばらしい匷力なものに翻蚳されおいるため、英語でレポヌトを芋るのが難しいず感じる人に特に圹立ちたす



Windbgは、ハヌドコアのC ++開発者のみが䜿甚できる非垞に耇雑なツヌルず芋なされたす。 ただし、このレポヌトでは、どのような堎合に.NET開発者に圹立぀か、WinDbgを䜿甚しお.NETアプリケヌションをデバッグし、本圓に耇雑な問題を解決できる堎合を瀺したす。

既にWinDbgを䜿甚しおいる人もいたすが、このレポヌトから䜕か新しいこずを孊べるこずを願っおいたす。 そしお、ただWinDbgに出䌚っおいない人のために、このツヌルがあなたに䜕をするこずができるのかをお芋せしたいず思いたす。


私たちのほずんどが毎日䜿甚するVisual Studioデバッガヌは、これから玹介する資料の玄90に察応したせん。 だからこそ、WinDbgを䜿甚しおこのすべおを玹介しおいたすこれは非垞に楜しいツヌルなのでたったく衚瀺されたせん。 Visual Studioにはないパワヌがありたす。

Visual Studioでうたくいかないずき


Visual Studioは匷力なデバッガヌず呌ばれたすか

圌は悪くない。 しかし、これはマりスやホットキヌを䜿甚したい人のためのおもちゃです。 IDEA、DDD、たたはWinDbgを備えたJDBのような本圓に匷力なデバッガず比范するず、Visual Studioは䞀皮のおもちゃです。 Visual Studio 2012のようにマクロがなくなったため、独自のスクリプトでデバッガヌを拡匵するこずは非垞に困難です。 デバッガヌメカニズム自䜓には実質的に拡匵機胜はありたせん。 たた、゜ヌスコヌドがあればVisual Studioも優れおいたす。 しかし、特定のものの゜ヌスコヌドがない堎合、䜕かをするのははるかに困難になりたす。 ほずんど䜕もできたせん。

したがっお、私はVisual Studioが奜きですが、より匷力なツヌルが必芁な堎合がいく぀かありたす。

おそらくあなたの䜕人かは、Linuxディストリビュヌションの゚ディションのRedditでこの図の元を芋たこずがありたす。


ここで、Visual Studioは最も短いひげです。 実際のオタクは、WinDbgのコン゜ヌルバヌゞョンであるWinDbg、cdbなどを䜿甚したす。 蚀い換えれば、孊ぶべきハヌドコアをい぀でも芋぀けるこずができたす。

それでは、最初にWinDbgを少し䜿いやすくするいく぀かのこずを芋おみたしょう。

WinDbgの怖さを軜枛


むンタラクティブメニュヌ


WinDbgが非垞に怖いのは、膚倧な数のコマンドを芚えおおく必芁があるからです。 ここにはいく぀かのメニュヌずショヌトカットがありたすが、倚くの堎合、倚くのテキストコマンドを手動で入力する必芁がありたす。

ただし、WinDbgには、この玠敵なメニュヌを䜜成する.cmdtreeコマンドがありたす。



マりスを䜿甚しおメニュヌ内を移動し、䟿利なコマンドを起動できたす。 私のリポゞトリの1぀には、カテゎリにグルヌプ化された䟿利なコマンドのむンタラクティブツリヌのサンプルファむルがありたす。 このメニュヌにより、初心者にずっおWinDbgが少し簡単になりたす。

出力内のリンク


コマンドの出力がずおも怖いので、倚くの人がWinDbgを奜きではないず思いたす。 そしお、ほずんどの堎合、コピヌず貌り付けを䜿甚する必芁がありたす。あるコマンドの結果を取埗しお、別のコマンドに枡したす。

気に入らない人のために、WinDbgバヌゞョンではDMLずいう名前で長い間デフォルトで有効になっおいるオプションがありたすDMLはデバッガヌマヌクアップ蚀語です。埌で䟋を瀺したす。 このオプションのおかげで、デバッガヌの最新バヌゞョンでは、コマンドの出力にリンクがありたす。 他の䜕かを取埗するには、リンクをクリックするだけです。

次の䟋では、 !name2eeずいうコマンドを実行したした。このコマンドはクラス名この䟋ではCクラスを取埗し、クラスに関する情報特に、アセンブリの堎所を提䟛したす。



コマンドの出力には、クリックできるリンクがありたす。 たずえば、EEClassフィヌルドの暪のリンクをクリックするず、次のようになりたす。



リンクは、タむプ情報を衚瀺する別のコマンドを起動したす。 スクリヌンショットの䞋郚にあるように、フィヌルド、タむプ、およびこのフィヌルドに関する远加情報がありたす。 たた、リンクがありたす。 それらをクリックするず、远加情報などが埗られたす。 すべおのチヌムを芚えおいない堎合、このツヌルキットがあれば、チヌムの結果を調査するのがより䟿利です。

自動化


WinDbgを怖がらせるもう1぀の機胜は、単玔なものの䞭には倧量のテキスト入力が必芁なものがあるこずです。 しかし、倚くの人が知らないもう1぀の䟿利な点がありたす。WinDbgを起動し、耇数のコマンドを䞀床に実行し、最埌に終了するこずができたす埌でいく぀か䟋を瀺したす。 基本的に、WinDbgには-cスむッチがあり、コマンドラむンを受け入れたす。

倱敗したプロセスのダンプファむルの䟋を䜿甚しお、この機胜をラむブでデモする方が簡単です。

フォルダC\ tempに、いく぀かのダンプファむルを保存したした。 WinDbgずcdbもありたす-前述のように、これはWinDbgのコン゜ヌルバヌゞョンです。 WinDbgcdbを䜿甚しおダンプファむルの1぀を開きたす。

 cdb.exe -z C:\temp\FileExplorer.exe.14804.dmp -c ".logopen C:\temp\crash.log; !analyze -v; .logclose; q" 

-zダンプ甚に切り替えたす。
-cダンプを開いた盎埌にコマンドを実行できたす。

䞻なこずは、ファむルを閉じお最埌に終了するこずを忘れないこずです。

".logopen C:\temp\crash.log; !analyze -v; .logclose; q" -このコマンドラむンはダンプファむルを分析し、有甚な情報を提䟛したす。

.logopenは、出力が実行されるログファむルを開きたすファむル内の行を怜玢しお埌で分析できるため、ログファむルの方が䜿いやすいです。

ここには、デバッガヌの基本的な自動化がありたす。デバッガヌを開始し、ダンプファむルを分析し、これらすべおをログファむルに入れお終了できたす。 そしお、これらのアクションは繰り返し可胜です-バッチモヌドで実行できたす。

その結果、ダンプで䜕が起こったかに぀いおの情報を取埗したす。 出力の最埌には、実行に関する情報、呌び出しスタック、その他の有甚な詳现が含たれおいたす。

別の䟋。 ここでは、出力結果でfindstrを実行しお、クラッシュしたプロセスの名前ず、䟋倖ず呌ばれる関数を芋぀けたした。



たた、オペレヌティングシステム、CLRバヌゞョンに関する情報もありたす-䞀般に、倚くの有甚なものです。

繰り返したすが、䟋は、メモリリヌクの怜玢でよく䜿甚するメ゜ッドです。 メモリリヌクが発生するず、プロセスがどんどん倧きくなっおいるこずがわかりたす。 そしお、定期的に接続しおから切断する必芁がありたす。 WinDbgを䜿甚しお行う方法を次に瀺したす。



メモリリヌクが発生する可胜性のあるプロセス参加したいに察しお-pnを-pnしおcdbを実行したすこの方が奜きなので。 次に、.NETヒヌプオブゞェクトの統蚈情報を衚瀺する!dumpheapを指定したす。 -minは、この堎合、10,000バむトを超えるオブゞェクトのみが必芁である-min意味したす。 最埌に、 qdを䜿甚しおqd終了しお切断したす。

このコマンドの実行埌、WinDbgはプロセスに接続し、10,000バむトを超えるヒヌプ内の䞊䜍オブゞェクトを衚瀺し、プロセスから切断したす。 蚀い換えれば、これは、メモリに䜕が起こるかを芋぀けるためのほが瞬時の方法です。 同じこずがバッチモヌドで実行できたす。 Visual Studioで䌌たようなこずをしたい人に幞運を。



スクリプト蚀語WinDbg


䞊蚘の自動化の䟋が、匷力なデバッガヌがある堎合に自動モヌドで実行し、スクリプトを䜜成しお繰り返し䜿甚できるこずを蚌明するこずを願っおいたす。 しかし、再利甚の利点を実際に掻甚するには、スクリプト蚀語の仕組みを理解する必芁がありたす。これは、WinDbgの最も耇雑で「ひどい」郚分です。

WinDbgにはスクリプト蚀語が組み蟌たれおいたすが、この蚀語は意図的に開発されたこずはありたせん。 Cずは異なり、その蚭蚈は別の委員䌚によっお管理されおいたす。 これは埐々に登堎する蚀語であり、誰かが䜕かを远加し、他の誰かがそれを修正したした。 私たちが持っおいるこずが起こった。

このスクリプトを芋おみたしょうさらに倚くの䟋があり、関連するチュヌトリアルがありたすが、この䌚話をWinDbgのスクリプトチュヌトリアルに倉えたせん。



ここで、最初の行は倉数$t0を倀0で初期化したす。 簡単です。 2行目は、特定の関数にブレヌクポむントを配眮したす。 NtAllocateVirtualMemory関数は、メモリを割り圓おるWindows APIです。 すべおのメモリ割り圓おは、䜕らかの方法でこのAPIを䜿甚する必芁がありたす。

ブレヌクポむントに到達するたびにこの関数を呌び出すずき、匕甚笊内でコマンドを実行したす䜕らかの恐ろしい匏で倉数$t0を増やしたすここで、 rdx倉数には割り圓おられたメモリの量が含たれおいたす。

次に、アプリケヌションを実行し続けるためにgを入力したした。 その埌、 .printfコマンドを䜿甚しお倉数$t0珟圚の倀を出力したす。これにより、割り圓おられた仮想メモリの合蚈量が.printfたす。

぀たり、ブレヌクポむントを蚭定したす。 各ブレヌクポむントは、割り圓おられたバむト数だけ倉数を増やしたす。 必芁になったら、この倉数の倀を出力しお、割り圓おられたメモリ量に関する情報を取埗したす。

ブレヌクポむント


どこかにブレヌクポむントを蚭定し、あなたのために䜕かをするずいう䞀般的なアプロヌチは非垞に効果的です。 Visual Studioでは、倚くの堎合、ブレヌクポむントを䜿甚しおデバッガヌを単玔に停止したす。 それは玠晎らしい、私もやる。 しかし、ブレヌクポむントの本圓の匷みは、それがあなたのために働くこずができるずいうこずですあなたのためにあなたのためにではない。

以䞋に、この䟋をいく぀か瀺したす。

ファむルを䜜成するアプリケヌションがあるが、これらのファむルがどこから来たのかわからないずしたす。 アプリケヌションは匕き続きファむルを䜜成したすが、それらを削陀せずにブロックしたす。 したがっお、アプリケヌションの実行䞭は、これらのファむルを削陀できたせん。 確かに倚くの人が同様の状況に盎面しおいたした。

これらのファむルがどこから来たのかを知りたいずしたす。 これを行うにはいく぀かの方法がありたす。 最も簡単なのは、ブレヌクポむントを远加するこずです。 ファむルを䜜成する堎所にブレヌクポむントを配眮しお、ファむルの出所を確認したしょう。



Windows APIには、ファむルを開くための2぀の䞻芁な関数CreateFileWずCreateFileAたす。

これらの関数のいずれかを呌び出すたびに、開くファむルの名前を出力したす。
ここで、 @esp+4は32ビットプロセスx86のスタックポむンタヌであり、 @esp+4は関数の最初のパラメヌタヌですこれは芚えおおく必芁はありたせん。これは、デバッガヌで確認できたす。 CreateFileWを呌び出す堎合、ファむル名はUnicode文字列であるため、 %mu圢匏を䜿甚したすCreateFileA堎合、ファむル名はANSI文字列であり、 %maを䜿甚したす。

次に、ファむル名ず3぀のダッシュを印刷したす。 kコマンドは、コヌルスタックを衚瀺したす。 その結果、アプリケヌションがファむルを開くたびに、どのファむルを開くかに぀いおのメッセヌゞがデバッガヌに衚瀺されたす呌び出しスタックは、そこに到達した方法を瀺したす。 䞊蚘の䟋はC ++呌び出しスタックですが、.NETアプリケヌションでも同じこずができたす。 さらにいく぀かの䟋を考えおみたしょう。

私のアプリケヌションがファむルの欠萜に぀いお䞍平を蚀っおいるずしたす-いく぀かのファむルを開くこずができたせん。 しかし、その理由ず堎所を正確に教えおくれたせん。 「ファむルを開けたせん」などの愚かな゚ラヌメッセヌゞのみが衚瀺されたす。 これは頻繁に起こりたす。

少し耇雑ですが、ブレヌクポむントを蚭定するだけです。 ゚ラヌが発生したこずがわかりたすファむルを開くこずができたせんでした。 これを行うには、 CreateFileW 以䞋の䟋では、小さな゚ラヌオフセット0x61は存圚しないはずです。無芖しおください。



そこで、ブレヌクポむントをCreateFileWに配眮したす。 guコマンドは、この関数から戻る前に実行されたす。 停止埌、 @eaxレゞスタを確認したす。 32ビットWindowsでは、 @eaxは関数の結果を保存したす。 64ビットWindowsでは、 @raxは本質的に同じ負荷を運びたす。 戻り倀がれロの堎合、ファむルを䜜成できたせんでした。 デバッガヌが呌び出しが機胜しなかったこずを確認した堎合、開くこずができなかったファむルを印刷したすそしお、再び呌び出しが発生した堎所で呌び出しスタックを印刷できたす。

繰り返したすが、デバッガは私のために機胜したすが、その逆は機胜したせん。 ファむルを開くこずができるすべおの堎所をコヌドで芋぀けようずはしおいたせん。 デバッガヌに次のように䌝えたす。「ファむルのオヌプンが倱敗したずきに知らせおください。」

StackOverflowの実際の䟋を次に瀺したす。



問題のなんず長い説明 この男は䜕かを理解しようずしおいたす。 そしお最埌に、圌は次の質問をしたす。「この定矩は疑問を提起したす。VirtualAllocを呌び出しおいるのは誰ですか ヒヌプマネヌゞャヌたたは.NETランタむムですか」

このタスクに察凊する方法を知っおいるず思いたす。



VirtualAllocブレヌクポむントを蚭定し、必芁なものをすべお芋぀けたす。 すべおがかなり明癜です-関数を呌び出しおいる人を知りたいですか そこにブレヌクポむントを眮き、必芁な情報を取埗したす。もっず簡単なこずは䜕ですか そのため、 VirtualAllocにブレヌクポむントを蚭定し、割り圓おられおいるメモリ量を出力したす。 マネヌゞコヌドの呌び出しスタック !clrstack も出力したす-これは私が話した䟋です。

したがっお、この䟋では、次のように衚瀺されたす。ガベヌゞコレクタヌから仮想メモリを割り圓おたす。 gc_heapスタック、 grow_heap_segment 、 virtual_alloc_commit_for_heapで、コンテンツを読み取るためにXMLDictionaryReaderによっお呌び出されXMLDictionaryReaderた。

埌続の凊理でブレヌクポむントをどこかに配眮する手法は、おそらくこのレポヌトの䞀郚ずしお提䟛する最も重芁なものです。 これは、Visual Studioにはない非垞に匷力なツヌルです。 Visual Studioは、ブレヌクポむントを挿入する゜ヌスコヌドがある堎合に適しおいたす。 ただし、Visual Studioでカスタムアクションや条件などを操䜜する必芁がある堎合は、基本的なサポヌトのみがありたす。 WinDbgを䜿甚するず、さらに倚くのこずができたす たた、WinDbgは、ブレヌクポむントを挿入する゜ヌスコヌドがない堎合Windows API呌び出したたはいく぀かの内郚CLR関数に配眮する予定がある堎合などに、はるかに優れおいたす。 WinDbgはずおもフレンドリヌだずは蚀えたせんが、間違いなく非垞に匷力です。

別の䟋に切り替えたしょう。 䞍良オブゞェクトが1぀あるこのオブゞェクトの膚倧なコレクションがあるずしたす。 なぜオブゞェクトが悪いのですか たずえば、゚ンコヌドを䞭断する小さなドットを持぀文字aが含たれおいたす。 私が芋぀けたいこの「壊れた」オブゞェクト。



あたり矎しくありたせんが、機胜したす。 レポヌトの終わりに向かっお、この問題を解決する別の方法を瀺したす。 そのため、最初にクラスの堎所を芋぀けたす!name2ee OrderService!OrderService.Order 。

これは私が探しおいるクラスです- Order 。 いいね 次に、クラスダンプを䜜成しお、必芁なフィヌルドがどこにあるかを芋぀けたすオブゞェクトの先頭を基準にしお。

[ Addressフィヌルドに興味がありたす。 ご芧のずおり、オブゞェクトの先頭からのオフセットは4です。



あずは、ヒヌプ内のOrderオブゞェクトを芋぀けお、オブゞェクトの先頭からオフセット4の行を芋぀けるだけです。 その埌、線の内偎を芋お、「䞊に䞞い点がある」かどうかを確認する必芁がありたす。

行を再床曞き盎すこずはありたせん-これは䞍芁ですが、いく぀かの重芁な点に蚀及したす。


最埌の䟋拡匵機胜に移る前では、いく぀かのクヌルなコマンドを瀺したす。

䞍思議なwtコマンドがありたすが、その意味を知っおいる人はほずんどいたせん。 コヌドの実行をトレヌスしたす。 関数を取埗し、 wt実行するず、この関数が行うすべおの呌び出しが出力されたす。 この堎合、トレヌスの深さを制限できたす。

たずえば、 mark_phase間にガベヌゞコレクタヌが䜕をするのか興味がありたした。 それでは、 mark_phaseずいうガベヌゞコレクタヌ関数にブレヌクポむントを蚭定しお、 wtを実行しおみたしょう。



その結果、この矎しいツリヌが埗られたす深さを1に制限したした mark_phaseによっおmark_phaseれるすべおの関数を取埗したす。 ガベヌゞコレクタヌの動䜜に興味がある堎合は、ここに倚くの詳现がありたす generation_size 、 GcScanRoots 、 scan_background_rootsおよび他の関数のヒヌプ。 完党な出力には耇数のペヌゞが含たれたす。 最埌に、すべおの機胜ず実行されたコマンドの数を含むレポヌトが衚瀺されたす。



したがっお、 mark_through_cards_for_segment 、 mark_through_cards_for_large_...などの呜什数の芳点から最も「高䟡な」関数を芋るこずができmark_through_cards_for_large_... 。

デバッガ内郚のプロファむラのように芋えたす。 プロファむリングは、プログラムの指瀺に埓っお段階的に進むこずを匷調するこずが重芁です。 非垞に遅い、぀たり プロファむリング自䜓は適切ではありたせん。 しかし、特定の方法で䜕が起こっおいるかを理解するこずは非垞に良いこずです。

拡匵機胜


䌚話のこの郚分では、いく぀かの䟿利な拡匵機胜を玹介したす。

Pykd


そしお、たずたずのものを䜿甚しおデバッガヌ甚のスクリプトを䜜成できる拡匵機胜から始めたす。



前に芋たスクリプトほど悪くはありたせん。 これはPyKDず呌ばれる非垞に玠晎らしい拡匵機胜です。 PyKDは䜕をしたすか Pythonを実行しおWinDbgを自動化できたす-぀たり WinDbgコマンドを実行し、出力を分析し、WinDbgでPythonツヌルを䜿甚したす。

䞊蚘の䟋はあたり興味深いものではありたせん。 ここでは、スタックが砎損しおいる堎合にスタックを修正しようずしおいたす。 ただし、その考えは、WinDbgで実行できるほずんどのこずに察しおPython APIを䜿甚するこずです。 ひどいWinDbg蚀語で曞かない1぀の方法は、Pythonを䜿甚するこずです。

私には、heap_stat.pyず呌ばれるPyKDを䜿甚しお䜜成された優れたスクリプトがありたす。



実際、これは.NET甚ではなく、C ++アプリケヌション甚ですが、C ++開発者に、前に瀺した機胜の䞀郚を提䟛したすヒヌプずそこにあるオブゞェクトの衚瀺。 .NETの堎合、これたで芋おきたように、これは非垞に簡単です。 C ++の堎合、これはもう少し耇雑です。

この拡匵機胜は、ヒヌプC ++で動䜜するPythonスクリプトであり、オブゞェクトを怜玢しお、このタむプのオブゞェクトの数を衚瀺したす。 堎合によっおは、合蚈サむズも出力できたす。 WinDbgスクリプト蚀語のみを䜿甚しおこれを行うこずは非垞に困難であり、Pythonを䜿甚するこずもできたす。 結局のずころ、これはPythonです。

拡匵モデル



他のいく぀かの拡匵機胜を芋おみたしょう。 原則ずしお、拡匵モデルは非垞に単玔です。



WinDbgの各拡匵機胜は単なるdllです。 関数の゚クスポヌトをサポヌトする任意の蚀語で、C ++たたはC-で蚘述できたす。 そしお、拡匵機胜をデバッガヌに枡し、各関数をコマンドずしお実行するだけです。

拡匵機胜は、デバッガヌAPIにアクセスできたす。 拡匵機胜が䜕かを衚瀺する堎合、たずえば、メモリ内のオブゞェクトを芋る堎合、デバッガヌむンタヌフェむスにアクセスできるずしたす。

基本的にどのように芋えるかを瀺すために私が蚭蚈した簡単な拡匵機胜を次に瀺したす。



この拡匵機胜は、コンテンツをURLで衚瀺したす。 デバッガヌから、HTTP芁求を実行し、受信したHTMLコヌドを印刷できたす。

拡匵機胜はCで蚘述されおおり、非垞に簡単です。結果がどのように芋えるかを芋おみたしょう。 これを行うために、WinDbgず参加可胜なプロセスメモ垳などを起動したす。 その埌、拡匵機胜をダりンロヌドしたす。たずえば、google.comにアクセスできたす。 むンタヌネット接続が機胜する堎合、この結果が埗られたす。



これはおそらくロシア語です゚ンコヌドはありたせん。

興味深いこずに、デバッガヌの出力には盎接リンクがありたす。 これにより、その䜿甚がナヌザヌにより開かれたす。 たずえば、ここでBloggerをクリックするず、画面の䞋郚に、デバッガヌが別のリク゚スト別のペヌゞを実行しおいるこずがわかりたす。 その結果、非垞にシンプルなテキストブラりザヌがデバッガヌに組み蟌たれたした。

䞊蚘のデバッガを拡匵する非垞に簡単な䟋を挙げたしたが、それがあなたの出発点ずしお圹立぀こずを願っおいたす。 本圓に匷力なこずを行う独自の拡匵機胜を䜜成するこずに興味がある堎合は、このアプロヌチを䜿甚しお独自の拡匵機胜を開発できたす。 難しくありたせん。Cで拡匵機胜を䜜成できたす。

いく぀かの既存の拡匵機胜を芋おみたしょう独自の拡匵機胜を䜜成するこずは必ずしも必芁ではありたせん。

CMKD


64ビットコヌドをデバッグするずきに盎面しなければならない兞型的な状況の䟋を次に瀺したす。 Windows 64ビットコヌドには呌び出し芏玄があり、最適化されたコヌドをデバッグするずきに関数の匕数を取埗するこずが非垞に難しくなりたす。 , , , , — . Visual Studio, WinDbg.



WaitForMultipleObjects , . , . : « , , , ». 4 , , , , « » 4 .

— cmkd , . , , .



, !stack . WaitForMultipleObjects . CMKD , .

, , . , , , rdx , , r13 . r13 - , . , - .

, . , .NET-, C++ 64- Windows ( , ).

SOSEX


— SOSEX . , , WinDbg , SOSEX — , .NET WinDbg.

SOSEX . Microsoft, ( SOSEX ). .

SOSEX — heap. heap .NET, , , heap — , 10 — , .

? heap — — . :



— .foreach — heap , (, ). !bhi , !mroot , , , Byte Schedule , , , Employee .

. — SOSEX !gcroot . 30 ( 30 ) — 5 . , , ( 30 ). !mroot 30 0 ( — , , ). , . heap, WinDbg, — SOSEX. — heap. .

netext


, , netext . Microsoft — . , . ASP.NET. , heap.



, !wruntime , ASP.NET, . .

!whttp , HTTP-, heap. HTTP-, ( ). , , , , .



HTTP- : , ( ) .. ASP.NET, .

netext SQL- . heap. SQL, , .



, HttpContext _request._rawUrl _response._statusCode . abc HTTP-.

( )?



netext. . Order , Address , $addr . . — .

netext , .

tracer


, (, , ) — . tracer. WinDbg, .

, , , , , . tracer , ( ) , — . , .




WinDbg, , , , , Visual Studio.

- Visual Studio, , Windows. , , — . WinDbg , , , , TCP, SSL, HTTP — , .

.
.



cdb ( TCP- 5050 ) .



, . x86 :
 cdb -remote tcp:server=localhost,port=5050 

: , , , .

. Microsoft , . . ずおも助かりたした。

WinDbg, — Smart Client.



, WinDbg WinDbg . dbgsrv.exe, , .

, . , , — ASP.NET.

. , , — .

WinDbg. , , «» . - , «» , - . , , . , , . , . , Visual Studio.

. WinDbg:


CLRMD :


:


msos — CLI-, C#:




20- — « The Performance Investigator's Field Guide », DotNext 2017 Piter ( — 19-20 ).

, «Production Performance and Troubleshooting of .NET Applications»

Source: https://habr.com/ru/post/J326454/


All Articles