Visual studio de debug
-
Upload
kazushi-kamegawa -
Category
Documents
-
view
4.521 -
download
2
description
Transcript of Visual studio de debug
Visual Studio de Debug かめがわ かずし(@kkamegawa)
自己紹介 かめがわ かずし /会社員
オンラインではkkamegawaというIDを使っています(twitter/hatena/Facebook/MSDN/Technet Forum)
6/3が誕生日でした(このスライド作っていたら誕生日が…)
@ITさんで連載やってます。
いまさら聞けないWindows Serverの開発活用術 – 現在進行中
Visual Studioデバッグ手法
パフォーマンスチューニング 今日はこれ
教えてください .NETアプリケーションのみで開発している
(アンマネージド/ネイティブはほとんど使わない)
アンマネージド/ネイティブのほうが圧倒的に多い
デバッグといえば?
開発中にやるもの?
単体テストで失敗したときにするもの?
どっちかといえば本番環境で起きて調べられなくて困っていませんか?
今日のAgenda
事後デバッグ
Visual Studio 2012で強化されたIntelliTrace
WER(Windows Error Reporting)の紹介
ちょっと便利なデバッグ機能
便利なWindowsのユーザーモードデバッグ支援機能
やらないこと
ダンプ解析Howto
カーネルモードデバッグ
IntelliTrace
Ultimateでしかつかえないけど強力
IntelliTraceとは
Visual Studio 2010 Ultimateに搭載されている.NETアプリケーション向けヒストリカルデバッグ機能
ヒストリカルデバッグとは、実行時に情報をキャプチャしておき、例外が起きた後からさかのぼって「その時何が起きていたのか」という情報を閲覧する
@ITのこちらの記事も読んでね 第2回 Visual Studio 2010の新機能「IntelliTrace」 http://www.atmarkit.co.jp/fdotnet/chushin/vsdebug_02/vsdebug_02_01.html
Test Managerと組み合わせると開発者と評価担当者でIntelliTraceの情報を共有できる
おまけ機能(?)も…
TFS +
Test Controller
開発者 テスター
.itraceファイル
(IntelliTrace)
失敗したテストを
TestManagerで登録
(.itraceファイルも登録) テスト結果を参照して
.itraceファイルを開く
チームによるIntelliTrace運用
※:画面はVisual Studio 2010英語版です
IntelliTraceのおまけ-Debugger Canvas
いわゆるCode Bubble(関数単位でポップアップしていく)
Visual Studioの拡張機能として提供される。
2012/6/9時点でVisual Studio 2010 SP1のみ対応
IntelliTraceの情報を参照することで実現されているので、残念ながらUltimateのみで使用可能。
Debugger Canvas
Visual Studio 2012のIntelliTrace強化
IIS 7.0/7.5向けスタンドアロン版IntelliTrace Collectorが追加
主に本番環境での採取可能にするため
たった2MBのコンパクトサイズ。インストーラーすらない
.NET Framework 3.5以降のプロジェクトが対象
二種類のプロファイルを提供
おおざっぱに取得するLow
詳細に取得するHigh
解析はVisual Studio Ultimateが必要
PowerShellコマンドレットで制御可能
Demo
Visual Studio 2012のIntelliTrace Collector
IntelliTrace Collectorインストール
IntelliTrace.exeを実行するとcabファイルが一つできる。
Cabファイルをexpandコマンドで展開(Explorerだとフォルダが認識されないので注意)
C:¥temp>expand –f:* Intellitracecollection.cab
D:¥IntelliTraceCollector
IntelliTrace Collector NTFS変更1
保存先フォルダに管理者もしくはPowerShellコマンドレット実行する人のフルアクセスを付ける
Collector展開先フォルダにアプリケーションプール実行ユーザーの読み取りと実行を付ける
Microsoft.IntelliTrace.Profiler.11.0.0.SC.dllにアプリケーションプール実行ユーザーの読み取りと実行を付ける
x64向けアセンブリは展開先のx64フォルダ内にある
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)
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
PowerShellで採取
ログ採取開始 PS>Start-IntelliTraceCollection <アプリケーションプール名> <プラン名> <IntelliTraceログ出力先>
スナップショット採取 PS>Checkpoint-IntellitraceCollection <アプリケーションプール名>
停止 PS>Stop-IntelliTraceCollection <アプリケーションプール名>
拡張子iTraceファイルが指定フォルダにできているので、Visual Studioで開く
IntelliTrace Collectorの注意点
とりすぎ注意。IntelliTraceの採取対象モジュールを絞る
たとえばレジストリアクセスなどは採取しない
Lowで15%程度の性能低下
Highでは広範囲に採取するため、かなり低下する
採取プラン(xmlファイルで定義)のカスタマイズほぼ必須。
アプリケーションプールで共有されているアプリに対して有効なので、複数のアプリケーションが共有している場合、対象のアプリケーションのみアプリケーションプールを分ける
IntelliTraceのログ上限を小さくする(デフォルト100MB)
SSDがあるならSSDを出力先にする
Windowsのデバッグ支援機能
ちょっと変わったプログラムのデバッグ時に知っておくと便利ですよ
Windows Error Reporting(参考)
WER(Windows Error Reporting)の標準設定ではMicrosoftのサーバーに特定の情報が送られて、解析される。 http://www.atmarkit.co.jp/ad/ms/msimpsbl0608/miimpsbl02/miimpsbl02.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
自分のプログラムのダンプがほしい
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¥Windows¥Windows Error Reporting¥LocalDumps
Windows Debugging Hook
使うとさらに便利です
必要なもの
Debugging Tools for Windows
通常Windows SDKに付属、もしくは単体でインストール
http://msdn.microsoft.com/ja-
jp/windows/hardware/gg463009.aspx
インストールするとGlobal Flagsというアプリケーションが追加されます。
複数のプロセスを同時に起動する
AとBというプロジェクトがあって、Bのデバッグを行う際にAも起動している必要があるだけならVisual Studioのマルチスタートアップ プロジェクトを使ってデバッグすればいい
他プロセスの状態に依存するとき
そうではなくて、ほかのプロセスが不定なタイミングで起動する(引数やデータベース、メモリの状態など)場合。
A.EXE B.EXE
C.EXE
DB
D.EXE
これをデバッグしたい
どれが起動されるかわからない
そこでGlobal Flag
Image(exe名)
Debuggerにチェック
隣にデバッガのパス
無効にするときは
Debuggerのチェックを
はずす
もう一つの方法
レジストリ編集する
HKEY_LOCAL_MACHINE¥SOFTWARE¥Microsoft¥Wind
ows NT¥CurrentVersion¥Image File Execution Options
この下に対象のプログラム名のキーを作成する。メモ帳ならnotepad.exe
キー内に以下の設定で作る
名前:Debugger
データ型:REG_SZ
データ:デバッガのフルパスと起動引数
Global Flagで設定できない時などにどうぞ。
DLLが呼ばれた時に止める
exeから任意のタイミングで呼び出されるDLL
典型的にはDLLとして提供するサービス
特定のソフトウェアのプラグインを作った場合
前と同じレジストリ編集
HKEY_LOCAL_MACHINE¥SOFTWARE¥Microsoft¥Wind
ows NT¥CurrentVersion¥Image File Execution Options
DLL名をキーとして作る(hogehoge.dll)
名前:BreakOnDllLoad
データ型:REG_DWORD
データ:1
あれ?サービスって…
一定期間(30秒)応答ないとエラーになるよね?
デバッグはOutputDebugString()でサービス版printf()?
レジストリでタイムアウト設定すれば回避可能です
(Windows 7では作ってください) キー:HKEY_LOCAL_MACHINE¥System¥CurrentControlSet¥C
ontrol
データ:ServicesPipeTimeout データ型:REG_DWORD
値:ミリ秒
デバッグ以外でも起動が遅いサービス(RDBMS)でも有効
(Service Control Managerのイベント7000/7011が出るとき)
まとめ
IntelliTrace(Collector)はマネージドコードのみ、さらにはUltimateエディションのみだが便利。特に今まで「本番環境じゃないと起きないけど、目星が大体ついている」というときなどに使ってください
Visual Studio以外にもたしなみとして、Debugging Tools for
Windowsに含まれるものは知っておいた方がいいです
Global Flagは乗りこなせばネイティブヒープのメモリリークもわかるので、これを機会におぼえてみてください!
参考資料
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