visual studio de debug

35
Visual Studio de Debug かめがわ かずし(@kkamegawa)

Upload: kazushi-kamegawa

Post on 21-Jun-2015

4.510 views

Category:

Documents


2 download

DESCRIPTION

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

TRANSCRIPT

Page 1: Visual studio de debug

Visual Studio de Debug かめがわ かずし(@kkamegawa)

Page 2: Visual studio de debug

自己紹介 かめがわ かずし /会社員

オンラインではkkamegawaというIDを使っています(twitter/hatena/Facebook/MSDN/Technet Forum)

6/3が誕生日でした(このスライド作っていたら誕生日が…)

@ITさんで連載やってます。

いまさら聞けないWindows Serverの開発活用術 – 現在進行中

Visual Studioデバッグ手法

パフォーマンスチューニング 今日はこれ

Page 3: Visual studio de debug

教えてください .NETアプリケーションのみで開発している

(アンマネージド/ネイティブはほとんど使わない)

アンマネージド/ネイティブのほうが圧倒的に多い

Page 4: Visual studio de debug

デバッグといえば?

開発中にやるもの?

単体テストで失敗したときにするもの?

どっちかといえば本番環境で起きて調べられなくて困っていませんか?

Page 5: Visual studio de debug
Page 6: Visual studio de debug

今日のAgenda

事後デバッグ

Visual Studio 2012で強化されたIntelliTrace

WER(Windows Error Reporting)の紹介

ちょっと便利なデバッグ機能

便利なWindowsのユーザーモードデバッグ支援機能

Page 7: Visual studio de debug

やらないこと

ダンプ解析Howto

カーネルモードデバッグ

Page 8: Visual studio de debug

IntelliTrace

Ultimateでしかつかえないけど強力

Page 9: Visual studio de debug

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の情報を共有できる

おまけ機能(?)も…

Page 10: Visual studio de debug

TFS +

Test Controller

開発者 テスター

.itraceファイル

(IntelliTrace)

失敗したテストを

TestManagerで登録

(.itraceファイルも登録) テスト結果を参照して

.itraceファイルを開く

チームによるIntelliTrace運用

Page 11: Visual studio de debug

※:画面はVisual Studio 2010英語版です

Page 12: Visual studio de debug

IntelliTraceのおまけ-Debugger Canvas

いわゆるCode Bubble(関数単位でポップアップしていく)

Visual Studioの拡張機能として提供される。

2012/6/9時点でVisual Studio 2010 SP1のみ対応

IntelliTraceの情報を参照することで実現されているので、残念ながらUltimateのみで使用可能。

Page 13: Visual studio de debug

Debugger Canvas

Page 14: Visual studio de debug

Visual Studio 2012のIntelliTrace強化

IIS 7.0/7.5向けスタンドアロン版IntelliTrace Collectorが追加

主に本番環境での採取可能にするため

たった2MBのコンパクトサイズ。インストーラーすらない

.NET Framework 3.5以降のプロジェクトが対象

二種類のプロファイルを提供

おおざっぱに取得するLow

詳細に取得するHigh

解析はVisual Studio Ultimateが必要

PowerShellコマンドレットで制御可能

Page 15: Visual studio de debug

Demo

Visual Studio 2012のIntelliTrace Collector

Page 16: Visual studio de debug

IntelliTrace Collectorインストール

IntelliTrace.exeを実行するとcabファイルが一つできる。

Cabファイルをexpandコマンドで展開(Explorerだとフォルダが認識されないので注意)

C:¥temp>expand –f:* Intellitracecollection.cab

D:¥IntelliTraceCollector

Page 17: Visual studio de debug

IntelliTrace Collector NTFS変更1

保存先フォルダに管理者もしくはPowerShellコマンドレット実行する人のフルアクセスを付ける

Collector展開先フォルダにアプリケーションプール実行ユーザーの読み取りと実行を付ける

Microsoft.IntelliTrace.Profiler.11.0.0.SC.dllにアプリケーションプール実行ユーザーの読み取りと実行を付ける

x64向けアセンブリは展開先のx64フォルダ内にある

Page 18: Visual studio de debug

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)

Page 19: Visual studio de debug

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

Page 20: Visual studio de debug

PowerShellで採取

ログ採取開始 PS>Start-IntelliTraceCollection <アプリケーションプール名> <プラン名> <IntelliTraceログ出力先>

スナップショット採取 PS>Checkpoint-IntellitraceCollection <アプリケーションプール名>

停止 PS>Stop-IntelliTraceCollection <アプリケーションプール名>

拡張子iTraceファイルが指定フォルダにできているので、Visual Studioで開く

Page 21: Visual studio de debug

IntelliTrace Collectorの注意点

とりすぎ注意。IntelliTraceの採取対象モジュールを絞る

たとえばレジストリアクセスなどは採取しない

Lowで15%程度の性能低下

Highでは広範囲に採取するため、かなり低下する

採取プラン(xmlファイルで定義)のカスタマイズほぼ必須。

アプリケーションプールで共有されているアプリに対して有効なので、複数のアプリケーションが共有している場合、対象のアプリケーションのみアプリケーションプールを分ける

IntelliTraceのログ上限を小さくする(デフォルト100MB)

SSDがあるならSSDを出力先にする

Page 22: Visual studio de debug

Windowsのデバッグ支援機能

ちょっと変わったプログラムのデバッグ時に知っておくと便利ですよ

Page 23: Visual studio de debug

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

Page 24: Visual studio de debug

自分のプログラムのダンプがほしい

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

Page 25: Visual studio de debug

Windows Debugging Hook

使うとさらに便利です

Page 26: Visual studio de debug

必要なもの

Debugging Tools for Windows

通常Windows SDKに付属、もしくは単体でインストール

http://msdn.microsoft.com/ja-

jp/windows/hardware/gg463009.aspx

インストールするとGlobal Flagsというアプリケーションが追加されます。

Page 27: Visual studio de debug

複数のプロセスを同時に起動する

AとBというプロジェクトがあって、Bのデバッグを行う際にAも起動している必要があるだけならVisual Studioのマルチスタートアップ プロジェクトを使ってデバッグすればいい

Page 28: Visual studio de debug

他プロセスの状態に依存するとき

そうではなくて、ほかのプロセスが不定なタイミングで起動する(引数やデータベース、メモリの状態など)場合。

A.EXE B.EXE

C.EXE

DB

D.EXE

これをデバッグしたい

どれが起動されるかわからない

Page 29: Visual studio de debug

そこでGlobal Flag

Image(exe名)

Debuggerにチェック

隣にデバッガのパス

無効にするときは

Debuggerのチェックを

はずす

Page 30: Visual studio de debug

もう一つの方法

レジストリ編集する

HKEY_LOCAL_MACHINE¥SOFTWARE¥Microsoft¥Wind

ows NT¥CurrentVersion¥Image File Execution Options

この下に対象のプログラム名のキーを作成する。メモ帳ならnotepad.exe

キー内に以下の設定で作る

名前:Debugger

データ型:REG_SZ

データ:デバッガのフルパスと起動引数

Global Flagで設定できない時などにどうぞ。

Page 31: Visual studio de debug

DLLが呼ばれた時に止める

exeから任意のタイミングで呼び出されるDLL

典型的にはDLLとして提供するサービス

特定のソフトウェアのプラグインを作った場合

前と同じレジストリ編集

HKEY_LOCAL_MACHINE¥SOFTWARE¥Microsoft¥Wind

ows NT¥CurrentVersion¥Image File Execution Options

DLL名をキーとして作る(hogehoge.dll)

名前:BreakOnDllLoad

データ型:REG_DWORD

データ:1

Page 32: Visual studio de debug

あれ?サービスって…

一定期間(30秒)応答ないとエラーになるよね?

デバッグはOutputDebugString()でサービス版printf()?

レジストリでタイムアウト設定すれば回避可能です

(Windows 7では作ってください) キー:HKEY_LOCAL_MACHINE¥System¥CurrentControlSet¥C

ontrol

データ:ServicesPipeTimeout データ型:REG_DWORD

値:ミリ秒

デバッグ以外でも起動が遅いサービス(RDBMS)でも有効

(Service Control Managerのイベント7000/7011が出るとき)

Page 33: Visual studio de debug

まとめ

IntelliTrace(Collector)はマネージドコードのみ、さらにはUltimateエディションのみだが便利。特に今まで「本番環境じゃないと起きないけど、目星が大体ついている」というときなどに使ってください

Visual Studio以外にもたしなみとして、Debugging Tools for

Windowsに含まれるものは知っておいた方がいいです

Global Flagは乗りこなせばネイティブヒープのメモリリークもわかるので、これを機会におぼえてみてください!

Page 34: Visual studio de debug

参考資料

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

Page 35: Visual studio de debug