Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Visual studio de debug

6,057 views

Published on

Debugging in Windows , use Intellitrace, WER, Global Flags in Japanese

  • Be the first to comment

Visual studio de debug

  1. 1. Visual Studio de Debugかめがわ かずし(@kkamegawa)
  2. 2. 自己紹介 かめがわ かずし /会社員 オンラインではkkamegawaというIDを使っています (twitter/hatena/Facebook/MSDN/Technet Forum) 6/3が誕生日でした(このスライド作っていたら誕生日が…) @ITさんで連載やってます。  いまさら聞けないWindows Serverの開発活用術 – 現在進行中  Visual Studioデバッグ手法  パフォーマンスチューニング 今日はこれ
  3. 3. 教えてください .NETアプリケーションのみで開発している (アンマネージド/ネイティブはほとんど使わない) アンマネージド/ネイティブのほうが圧倒的に多い
  4. 4. デバッグといえば? 開発中にやるもの? 単体テストで失敗したときにするもの? どっちかといえば本番環境で起きて調べられなくて困っていま せんか?
  5. 5. 今日のAgenda 事後デバッグ  Visual Studio 2012で強化されたIntelliTrace  WER(Windows Error Reporting)の紹介 ちょっと便利なデバッグ機能  便利なWindowsのユーザーモードデバッグ支援機能
  6. 6. やらないこと ダンプ解析Howto カーネルモードデバッグ
  7. 7. Ultimateでしかつかえないけど強力IntelliTrace
  8. 8. IntelliTraceとは Visual Studio 2010 Ultimateに搭載されている.NETアプリ ケーション向けヒストリカルデバッグ機能 ヒストリカルデバッグとは、実行時に情報をキャプチャしておき、 例外が起きた後からさかのぼって「その時何が起きていたの か」という情報を閲覧する @ITのこちらの記事も読んでね 第2回 Visual Studio 2010の新機能「IntelliTrace」 http://www.atmarkit.co.jp/fdotnet/chushin/vsdebug_02/vsd ebug_02_01.html Test Managerと組み合わせると開発者と評価担当者で IntelliTraceの情報を共有できる おまけ機能(?)も…
  9. 9. チームによるIntelliTrace運用 失敗したテストを TestManagerで登録 テスト結果を参照して (.itraceファイルも登録) .itraceファイルを開く TFS + Test Controller .itraceファイル (IntelliTrace) テスター 開発者
  10. 10. ※:画面はVisual Studio 2010英語版です
  11. 11. IntelliTraceのおまけ-Debugger Canvas いわゆるCode Bubble(関数単位でポップアップしていく) Visual Studioの拡張機能として提供される。 2012/6/9時点でVisual Studio 2010 SP1のみ対応 IntelliTraceの情報を参照することで実現されているので、残 念ながらUltimateのみで使用可能。
  12. 12. Debugger Canvas
  13. 13. Visual Studio 2012のIntelliTrace強化 IIS 7.0/7.5向けスタンドアロン版IntelliTrace Collectorが追加  主に本番環境での採取可能にするため  たった2MBのコンパクトサイズ。インストーラーすらない  .NET Framework 3.5以降のプロジェクトが対象 二種類のプロファイルを提供  おおざっぱに取得するLow  詳細に取得するHigh 解析はVisual Studio Ultimateが必要 PowerShellコマンドレットで制御可能
  14. 14. Visual Studio 2012のIntelliTrace CollectorDemo
  15. 15. IntelliTrace Collectorインストール IntelliTrace.exeを実行するとcabファイルが一つできる。 Cabファイルをexpandコマンドで展開(Explorerだとフォルダ が認識されないので注意) C:¥temp>expand –f:* Intellitracecollection.cab D:¥IntelliTraceCollector
  16. 16. IntelliTrace Collector NTFS変更1 保存先フォルダに管理者もしくはPowerShellコマンドレット実 行する人のフルアクセスを付ける Collector展開先フォルダにアプリケーションプール実行ユー ザーの読み取りと実行を付けるMicrosoft.IntelliTrace.Profiler.11.0.0.SC.dllにアプリケー ションプール実行ユーザーの読み取りと実行を付ける x64向けアセンブリは展開先のx64フォルダ内にある
  17. 17. IntelliTrace Collector NTFS変更(実例) DefaultAppPoolのユーザーにIntelliTraceCollectorが格納さ れているC:¥IntelliTraceCollectorに対して読み取りと実行を 許す例 c:¥>icacls C:¥IntelliTraceCollector /grant "IIS APPPOOL¥DefaultAppPool":(RX) DefaultAppPoolのユーザーにC:¥IntelliTraceDataフォルダ にログデータの書き込みを許す例 c:¥>icacls C:¥IntelliTraceData /grant "IIS APPPOOL¥DefaultAppPool":(F)
  18. 18. PowerShellコマンドレット準備 PowerShellを追加していない環境はないはずなので略 (同様にSet-ExecutionPolicyも略) x64のログ採取をするときはx64用PowerShell。アプリケー ションプールをx86に設定したASP.NETアプリケーションのロ グ採取をするときはPowerShell (x86)を「管理者として起動」 Microsoft.VisualStudio.IntelliTrace.PowerShell.dllをimport する PS>import-module <IntelliTraceCollector>Microsoft.VisualStudio.IntelliTrace. PowerShell.dll
  19. 19. PowerShellで採取 ログ採取開始 PS>Start-IntelliTraceCollection <アプリケーションプール名 > <プラン名> <IntelliTraceログ出力先> スナップショット採取 PS>Checkpoint-IntellitraceCollection <アプリケーション プール名> 停止 PS>Stop-IntelliTraceCollection <アプリケーションプール名 > 拡張子iTraceファイルが指定フォルダにできているので、 Visual Studioで開く
  20. 20. IntelliTrace Collectorの注意点 とりすぎ注意。IntelliTraceの採取対象モジュールを絞る  たとえばレジストリアクセスなどは採取しない  Lowで15%程度の性能低下  Highでは広範囲に採取するため、かなり低下する  採取プラン(xmlファイルで定義)のカスタマイズほぼ必須。 アプリケーションプールで共有されているアプリに対して有効 なので、複数のアプリケーションが共有している場合、対象の アプリケーションのみアプリケーションプールを分ける IntelliTraceのログ上限を小さくする(デフォルト100MB) SSDがあるならSSDを出力先にする
  21. 21. ちょっと変わったプログラムのデバッグ時に知っておくと便利ですよWindowsのデバッグ支援機能
  22. 22. Windows Error Reporting(参考) WER(Windows Error Reporting)の標準設定ではMicrosoftの サーバーに特定の情報が送られて、解析される。 http://www.atmarkit.co.jp/ad/ms/msimpsbl0608/miimpsbl02/mii mpsbl02.html システム・エラーと闘う人々 http://msdn.microsoft.com/ja- jp/library/windows/hardware/gg487468.aspx WER がエラー報告を収集して分類するしくみ MSに送らず、組織内ダンプ&クラッシュ情報を集める設定もできる よ!(有償だとSCOM 2007が対応) http://technet.microsoft.com/ja-jp/library/cc540375.aspx WERプロトコルは公開されているので、がんばれば作れる。 http://msdn.microsoft.com/en- us/library/dd942170%28PROT.10%29.aspx
  23. 23. 自分のプログラムのダンプがほしい WERのレジストリを設定する(詳細) http://msdn.microsoft.com/en- us/library/bb513638%28VS.85%29.aspx WER Settings ユーザーモードダンプを構成する http://msdn.microsoft.com/en- us/library/windows/desktop/bb787181(v=vs.85).aspx Collecting User-mode Dumps 以下のレジストリキーを追加するだけ で%LOCALAPPDATA%CrashDumpsに生成される HKEY_LOCAL_MACHINE¥SOFTWARE¥Microsoft¥Wind ows¥Windows Error Reporting¥LocalDumps
  24. 24. 使うとさらに便利ですWindows Debugging Hook
  25. 25. 必要なもの Debugging Tools for Windows 通常Windows SDKに付属、もしくは単体でインストール http://msdn.microsoft.com/ja- jp/windows/hardware/gg463009.aspx インストールするとGlobal Flagsというアプリケーションが追 加されます。
  26. 26. 複数のプロセスを同時に起動する AとBというプロジェクトがあって、Bのデバッグを行う際にAも 起動している必要があるだけならVisual Studioのマルチス タートアップ プロジェクトを使ってデバッグすればいい
  27. 27. 他プロセスの状態に依存するとき そうではなくて、ほかのプロセスが不定なタイミングで起動す る(引数やデータベース、メモリの状態など)場合。 どれが起動され るかわからない B.EXE A.EXE これをデバッグ したい C.EXE D.EXE DB
  28. 28. そこでGlobal Flag Image(exe名) Debuggerにチェック 隣にデバッガのパス 無効にするときは Debuggerのチェックを はずす
  29. 29. もう一つの方法 レジストリ編集する HKEY_LOCAL_MACHINE¥SOFTWARE¥Microsoft¥Wind ows NT¥CurrentVersion¥Image File Execution Options この下に対象のプログラム名のキーを作成する。メモ帳なら notepad.exe キー内に以下の設定で作る 名前:Debugger データ型:REG_SZ データ:デバッガのフルパスと起動引数 Global Flagで設定できない時などにどうぞ。
  30. 30. DLLが呼ばれた時に止める exeから任意のタイミングで呼び出されるDLL  典型的にはDLLとして提供するサービス  特定のソフトウェアのプラグインを作った場合 前と同じレジストリ編集 HKEY_LOCAL_MACHINE¥SOFTWARE¥Microsoft¥Wind ows NT¥CurrentVersion¥Image File Execution Options DLL名をキーとして作る(hogehoge.dll) 名前:BreakOnDllLoad データ型:REG_DWORD データ:1
  31. 31. あれ?サービスって… 一定期間(30秒)応答ないとエラーになるよね? デバッグはOutputDebugString()でサービス版printf()? レジストリでタイムアウト設定すれば回避可能です (Windows 7では作ってください) キー:HKEY_LOCAL_MACHINE¥System¥CurrentControlSet¥C ontrol データ:ServicesPipeTimeout データ型:REG_DWORD 値:ミリ秒 デバッグ以外でも起動が遅いサービス(RDBMS)でも有効 (Service Control Managerのイベント7000/7011が出るとき)
  32. 32. まとめ IntelliTrace(Collector)はマネージドコードのみ、さらには Ultimateエディションのみだが便利。特に今まで「本番環境 じゃないと起きないけど、目星が大体ついている」というときな どに使ってください Visual Studio以外にもたしなみとして、Debugging Tools for Windowsに含まれるものは知っておいた方がいいです Global Flagは乗りこなせばネイティブヒープのメモリリークも わかるので、これを機会におぼえてみてください!
  33. 33. 参考資料 Special Thanks Edtter http://edtter.codeplex.com/ Inside Windows Debugging http://shop.oreilly.com/product/0790145335500.do Windows Internals 6th Part1 http://shop.oreilly.com/product/0790145305930.do

×