[[917]] の続編。 .NETアプリケーションのデバッグにおける、"Debugging Tools for Windows"やMS謹製のフリーツールの使用方法や問題分析の流れを詳しく解説している。 #amazon||> ||< - Advanced .NET Debugging -- http://www.advanceddotnetdebugging.com/ 内容の詳細はアマゾンなどを参照して欲しい。 個人的なお薦めポイントとしては、CLRと.NET Frameworkの関係、「アセンブリ」の概念とロード機構、CLRのヒープ管理とGC、ファイナライズキューなどなどの、.NETで今ひとつ分かりづらいけど重要な「裏舞台」を分かりやすく紹介してくれている点。.NET入門者にとっては呪文めいた「アセンブリ」や「マニフェスト」といった用語がきちんと解説されている。 注意点としては、実際のデバッグの流れが掲載されているが、若干の省略が見られる点。特に .loadby sos mscorwks は省略されがちに思えた。デバッグコマンドが一つ一つ書かれているからと言って、その通りに最初から打ち込んでもうまくいかない原因は大抵、こうした前提となるイロハのコマンドが省略されているから。そこだけ注意が必要。 他にも何気にtypoミスがあったり、酷いところでは公式HPからDLできるサンプルコードに抜けがあったりする。下記HPを参照のこと。 - Advanced .NET Debugging book - If broken it is, fix it you should - Site Home - MSDN Blogs -- http://blogs.msdn.com/b/tess/archive/2009/12/15/advanced-net-debugging-book.aspx - Advanced .NET Debugging – The Book by Mario Hewardt » Advanced .NET Debugging -- http://dotnetdebug.net/2009/11/30/advanced-net-debugging-the-book-by-mario-hewardt/ いくつか「編集者真面目に仕事したのか・・・?」と首を傾げる点はあるものの、本書の価値を損なうほどのものではない。.NETアプリの開発に携わる人達であれば一読しておいて損はない一冊となっている。 #more|| ---- 以下、本書を読んでいて気になった点などメモ。補足的なメモや、本書出版から数年が経過している2011年現在、紹介されているツールでいくつか注意点が出てきたものなど。 : ".loadby sos mscorwks" で "Unable to find module 'mscorwks'" 発生 :#block||> http://geekswithblogs.net/.netonmymind/archive/2006/03/14/72262.aspx のコメント参照。mscorwks.dllが読み込まれていない段階で".loadby"やっちゃってるので、まずは"g"などで続行させ、loadされた段階でCtrl-BREAK, Ctrl-Cなどで停止、".loadby"し直せばOK. あるいは sxe ld mscorwks.dll しておけば、mscorwks.dllがロードされた時点で一旦デバッガにbreakするので、そこで ".loadby" してもよい。 ||< : CLR ProfilerとCLRのバージョン :#block||> CLR Profiler: 3.5までは 2.0のCLR使ってるので .NET 2.0用のCLR ProfilerでOKのはず。 http://stackoverflow.com/questions/1055803/is-there-a-clr-profiler-that-works-with-net-3-5-sp1-and-wpf .NET 4.0で.NET 2.0用CLR使う場合は環境変数をセット。 http://social.msdn.microsoft.com/Forums/ja-JP/vsgeneralja/thread/a97370a2-faf8-4a9c-8d0a-37099b8038b4 2011年1月末に、4.0に対応したCLRProfilerがでたばっかり: http://www.microsoft.com/downloads/en/details.aspx?FamilyID=be2d842b-fdce-4600-8d32-a3cf74fda5e1 ||< : CLR Profilerで "Waiting for application to start common language runtime" が消えない :#block||> 「管理者として実行」する+.NETランタイムのバージョンを確認する。片手落ちだとこのメッセージが消えず、プロファイルも取れない。 詳細は"CLRProfiler Waiting for application to start common language runtime"でggrks. ||< : その他、フリーの.NETアプリプロファイラ : http://d.hatena.ne.jp/Wacky/20080823/1219500273 : 本書中で紹介されているフリーの逆コンパイラ, ".NET Reflector"について :#block||> 2011年3月以降、有償化されるようです。 http://www.atmarkit.co.jp/fdotnet/tools/dotfuscator/dotfuscator_01.html http://www.red-gate.com/products/dotnet-development/reflector/ ||< : .NET Managed Debugging Assistants 参考資料 :#block||> - Diagnosing Errors with Managed Debugging Assistants -- http://msdn.microsoft.com/en-us/library/d21c150d.aspx --- "MSDN Library" > ".NET Development" > ".NET Framework 4" > ".NET Framework Core Development" > "Debugging, Tracing, and Profiling" > "Diagnosing Errors with Managed Debugging Assistants" - Let the CLR Find Bugs For You With Managed Debugging Assistants -- http://msdn.microsoft.com/en-us/magazine/cc163606.aspx - InformIT: .NET Reference Guide > Managed Debugging Assistants in .NET 2.0 -- http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=500 有効・無効の切り替え: reg query HKLM\SOFTWARE\Microsoft\.NETFramework /v MDA reg add HKLM\SOFTWARE\Microsoft\.NETFramework /v MDA /t REG_SZ /d "1" reg add HKLM\SOFTWARE\Microsoft\.NETFramework /v MDA /t REG_SZ /d "0" 使い終わったら"0"に戻しておく。 ||< : fuslogvw.exe 関連のトラブル :#block||> "HKLM\Software\Microsoft\Fusion!EnableLog"を1にするのを忘れずに。 reg add HKLM\Software\Microsoft\Fusion /v EnableLog /t REG_DWORD /d 1 管理者権限が必要なので、Vista以降なら「管理者として実行」するのを忘れずに。 あと、ログ保存先は"Custom log"にしないと保存してくれなかった。 ||< : アプリケーションドメイン一覧から"!name2ee"まで辿る流れ :#block||> 書かれてないのが不思議なくらいだったのでメモ。 !dumpdomain ↓ドメインの一覧→アセンブリGET !dumpassembly ↓アセンブリの一覧→モジュールGET !dumpmodule -mt ↓モジュール→ Method Table GET !dumpmt -md ↓MT→Method Descriptor GET !dumpmd ↓MD→"!name2ee"に渡せる完全タイプ名取得 !name2ee ||< : Chapter4 の 04CodeGen.exe(.cs) がおかしい : 謎。 [[926]] 参照。 ショートカット用のピンポイントメモ: : MDA xml file -> "assistant" elements -> Alphanumeric order : p20 : "sxe clr" enables CLR Exception break : p130 : "Retail v.s. Debug Builds" from JIT & GC perspective : p223 : "Pinned Objects", GC, "fixed" buffers : p248- : "!verifyHeap" and GC timing : p260 : lock window and "lock" syntax sugar : p334 : "delegate" calling convention in unmanaged world : p372