ケーススタディから学ぶ
実践的 DEBUGGING
2013/06/03
ケーススタディから学ぶ実践的 ASP.NET 勉強会
@kumake1004
Who...?
• My name is...
• @kumake1004 / kumake
• はてなだけ kendik
• My work is...
• 都内某ベンチャー勤務
• Pro Exceler
• 動作検証、調査を行ったり
• 調整(要件、人、スケジュール)に奔走したり
• ごく稀にプログラミング
今日お話しすること
• コードを書かないのでノウハウ無し
• 今日は Debug / Diagnostic ツールの紹介
• まだコードを書いていた時代に遭遇した問
題や、同僚が遭遇した問題に絡めてケース
スタディから学んでる感を演出します
デバッグについて
“一般的に言って、デバッグは面倒で退屈な
作業である。
実際の作業ではプログラマのデバッグに関
するスキルがおそらく最も重要な要素とな
るが、ソフトウェアのデバッグの難易度は
使用するプログラミング言語やデバッガな
どのツールによって大きく左右される。”
- Wikipedia デバッグ
そう、生産性
• ソフトウェア開発において、コーディング
が占める割合はほんの僅か
• 大半は要件定義、設計、テスト
• 僅かしかないコーディングも、デバッグが
半分以上(主観)
楽しいコーディングのために
• デバッグ作業を
• もっと効率よく
• もっと手軽に
• 今日紹介するツールで、尐しでもデバッグ
が楽になれば
事例 その一
パフォーマンスチューニングしてた
• パフォーマンスチューニングはボトルネッ
クの特定から
• ASP.NET MVC & C# 環境でパフォーマン
スのボトルネックを特定するには?
たとえばこんなコードが
public ActionResult HogeAction(int id)
{
var model = _repo.Find(id);
if(model.Hage())
{
model.Something = "hogehoge";
_repo.Save();
}
return View(model);
}
当時はこんな解決
• System.Diagnostics.Stopwatch
• Stopwatch.StartNew スタティックメソッドで
ストップウォッチを開始して、
• Stopwatch.Stop メソッドでストップウォッチを
止めて
• Stopwatch.ElapsedMilliseconds プロパティの結
果を Console.WriteLine スタティックメソッド
で出力する
こんな汚いコードに
public ActionResult HogeAction(int id)
{
var sw = Stopwatch.StartNew();
var model = _repo.Find(id);
sw.Stop();
Console.WriteLine("Elapsed1 > " + sw.ElapsedMilliseconds);
sw.Restart();
if(model.Hage())
{
var sw2 = Stopwatch.StartNew();
model.Something = "hogehoge";
_repo.Save();
sw2.Stop();
Console.WriteLine("Elapsed2 > " + sw2.ElapsedMilliseconds);
}
sw.Stop();
Console.WriteLine("Elapsed1 > " + sw.ElapsedMilliseconds);
sw.Restart();
return View(model);
}
もう尐しスマートにやるなら
• Miniprofiler の導入
• UI キレイ
• Entity Framework のクエリと Duration も
見れる
でも実は...
• これだけの情報を表示するなら
• Global.asax に修正が必要
• Application_BeginRequest イベント
• Application_EndRequest イベント
でも実は...
• 計測箇所にも修正が必要
using StackExchange.Profiling;
...
// 計測用オブジェクトを作って
var profiler = MiniProfiler.Current;
// 計測したい処理を using 内に
using (profiler.Step("Set page title"))
{
ViewBag.Title = "Home Page";
}
using (profiler.Step("Doing complex stuff"))
{
using (profiler.Step("Step A"))
{
Thread.Sleep(100);
}
using (profiler.Step("Step B"))
{
Thread.Sleep(250);
}
}
もっと簡単にデバッグ出来ないか
• 自分で計測コードを埋め込むと面倒
• 埋め込んだら埋め込んだで、コードが非常
に汚くなる
• ライブラリを使うと、見え方はキレイにな
る
• でも相変わらず実装に修正が必要
事例 その二
MVC のコントローラ作ってた
• 上手くルーティングされない
• 上手くモデルバインディングされない
当時はこんな解決
• とにかく気合いでデバッグ(白目
• ルーティングを最小限にして、一つずつ問
題の切り分け
• モデルバインディングも、モデルの属性を
減らして、一つずつ問題の切り分け
Stackoverflow でも…
• Stackoverflow
• http://stackoverflow.com/questions/4651085/best-practices-
for-debugging-asp-net-mvc-binding
回答
• MVC ソースコードのステップ実行
もう尐しスマートにやるなら
• ASP.NET MVC
Routing Debugger
モデルバインディングは?
• なし
• (何か良いのあったら教えてください)
Web API なら
• Web API
Route Debugger
一択
もっと簡単にデバッグ出来ないか
• 地道にやるのは耐えられない
• いくつか使えそうなツールはあるが...
• 問題領域毎にライブラリ/ツールを入れるの?
• 溢れるリポジトリ(Nuget パッケージの復元のお
陰で今は大分楽だけど)
• で、モデルバインディングは?
GLIMPSE の紹介
統合デバッグ環境 Glimpse
Glimpse の紹介...の前に
• Glimpse を見つけて遊んでたのが 5/17 頃
• 日本語の情報がほとんど無いからあまり知
られていない?
• これは勉強会のテーマに良いかも!?
tが、5/22 witter にて
あっ...(察し
改めて Glimpse
• OSS の Debug / Diagnostic ツール
• Nuget からインストール可能
• PM> Install-Package Glimpse
• プラグインによってデバッグ出来る内容が
異なる
• プラグインも Nuget からインストールで簡単
• e.g. Glimpse.AspNet, Glimpse.Mvc4,
Glimpse.EF6, Glimpse.SignalR ...
改めて Glimpse
Glimpse でどうなる?
• コレ一つでほとんどのケースをデバッグ可
• Entity Framework のクエリ / duration 確認可能
• アクションメソッドの duration 確認可能
• Routing Resolution も確認可能
• モデルバインディングも確認可能
• リモート環境のデバッグが出来る
• 他のデバッグツールが不要
• ツールは尐ない方が良いよね!
• デバッグノウハウも共有
• 実装への影響もなし
• Web.config への修正だけで OK
DEMO
• Glimpse のインストール
• Glimpse デバッグ画面の確認
• いくつかの機能を実際に確認
• Configuration
• Session
• Model Binding
• Ajax
• Trace
• Execution
• Entity Framework SQL
• PM> Install-Package Glimpse.EF5
• Web.config の修正
まとめ
• クライアントサイドのデバッグを置き換え
るものではない
• Chrome Developer Tool と併用可能
• サーバサイドのデバッグは Glimpse にお任
せ
• Glimpse でデバッグ時間を短縮して快適な
開発ライフを
ご清聴
ありがとうございました

20130603 aspnet勉強会 実践的debugging