SlideShare uma empresa Scribd logo
1 de 37
ケーススタディから学ぶ
実践的 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 でデバッグ時間を短縮して快適な
開発ライフを
ご清聴
ありがとうございました

Mais conteúdo relacionado

Mais procurados

速度改善のためにフロント:アプリ:インフラ エンジニアが使うツールについて
速度改善のためにフロント:アプリ:インフラ エンジニアが使うツールについて速度改善のためにフロント:アプリ:インフラ エンジニアが使うツールについて
速度改善のためにフロント:アプリ:インフラ エンジニアが使うツールについてDaisuke Tamada
 
中の下のエンジニアを脱出するための目標設定
中の下のエンジニアを脱出するための目標設定中の下のエンジニアを脱出するための目標設定
中の下のエンジニアを脱出するための目標設定空宙 小笠原
 
単体テストのすゝめ
単体テストのすゝめ単体テストのすゝめ
単体テストのすゝめLi Satoshi
 
いいテスト会 (スプリントレビュー) をやろう!
いいテスト会 (スプリントレビュー) をやろう!いいテスト会 (スプリントレビュー) をやろう!
いいテスト会 (スプリントレビュー) をやろう!虎の穴 開発室
 
DevLove 甲子園2014 インクリメンタルに 設計・テストする
DevLove 甲子園2014 インクリメンタルに設計・テストするDevLove 甲子園2014 インクリメンタルに設計・テストする
DevLove 甲子園2014 インクリメンタルに 設計・テストするYasushi Hagai
 
ゲーム開発プロセスカイゼン
ゲーム開発プロセスカイゼンゲーム開発プロセスカイゼン
ゲーム開発プロセスカイゼン光晶 上原
 
プログラマーのお仕事
プログラマーのお仕事プログラマーのお仕事
プログラマーのお仕事Kohei Kadowaki
 
メタな感じのプログラミング(プロ生 + わんくま 071118)
メタな感じのプログラミング(プロ生 + わんくま 071118)メタな感じのプログラミング(プロ生 + わんくま 071118)
メタな感じのプログラミング(プロ生 + わんくま 071118)Tatsuya Ishikawa
 

Mais procurados (9)

速度改善のためにフロント:アプリ:インフラ エンジニアが使うツールについて
速度改善のためにフロント:アプリ:インフラ エンジニアが使うツールについて速度改善のためにフロント:アプリ:インフラ エンジニアが使うツールについて
速度改善のためにフロント:アプリ:インフラ エンジニアが使うツールについて
 
中の下のエンジニアを脱出するための目標設定
中の下のエンジニアを脱出するための目標設定中の下のエンジニアを脱出するための目標設定
中の下のエンジニアを脱出するための目標設定
 
単体テストのすゝめ
単体テストのすゝめ単体テストのすゝめ
単体テストのすゝめ
 
engineer-life
engineer-lifeengineer-life
engineer-life
 
いいテスト会 (スプリントレビュー) をやろう!
いいテスト会 (スプリントレビュー) をやろう!いいテスト会 (スプリントレビュー) をやろう!
いいテスト会 (スプリントレビュー) をやろう!
 
DevLove 甲子園2014 インクリメンタルに 設計・テストする
DevLove 甲子園2014 インクリメンタルに設計・テストするDevLove 甲子園2014 インクリメンタルに設計・テストする
DevLove 甲子園2014 インクリメンタルに 設計・テストする
 
ゲーム開発プロセスカイゼン
ゲーム開発プロセスカイゼンゲーム開発プロセスカイゼン
ゲーム開発プロセスカイゼン
 
プログラマーのお仕事
プログラマーのお仕事プログラマーのお仕事
プログラマーのお仕事
 
メタな感じのプログラミング(プロ生 + わんくま 071118)
メタな感じのプログラミング(プロ生 + わんくま 071118)メタな感じのプログラミング(プロ生 + わんくま 071118)
メタな感じのプログラミング(プロ生 + わんくま 071118)
 

Semelhante a 20130603 aspnet勉強会 実践的debugging

パネルディスカッション資料(公開版)
パネルディスカッション資料(公開版)パネルディスカッション資料(公開版)
パネルディスカッション資料(公開版)odakeiji
 
仕様七変化
仕様七変化仕様七変化
仕様七変化galluda
 
GCSアジャイル開発を使ったゲームの作り方
 GCSアジャイル開発を使ったゲームの作り方 GCSアジャイル開発を使ったゲームの作り方
GCSアジャイル開発を使ったゲームの作り方Hiroyuki Tanaka
 
今、おさえておきたい DevOps
今、おさえておきたい DevOps 今、おさえておきたい DevOps
今、おさえておきたい DevOps 智治 長沢
 
#STAC2014 システムテスト自動化ハンズオン
#STAC2014 システムテスト自動化ハンズオン#STAC2014 システムテスト自動化ハンズオン
#STAC2014 システムテスト自動化ハンズオンkyon mm
 
オトナのプログラミング勉強会 オトナのDeep Learning 2016-11
オトナのプログラミング勉強会 オトナのDeep Learning 2016-11オトナのプログラミング勉強会 オトナのDeep Learning 2016-11
オトナのプログラミング勉強会 オトナのDeep Learning 2016-11Katsuhiro Morishita
 
20120927 findjob4 dev_ops
20120927 findjob4 dev_ops20120927 findjob4 dev_ops
20120927 findjob4 dev_opsume3_
 
非開発者のためのアジャイル開発入門
非開発者のためのアジャイル開発入門非開発者のためのアジャイル開発入門
非開発者のためのアジャイル開発入門Kiro Harada
 
Dockerを使ってローカルテストを良い感じに実装した話
Dockerを使ってローカルテストを良い感じに実装した話Dockerを使ってローカルテストを良い感じに実装した話
Dockerを使ってローカルテストを良い感じに実装した話Ryo Yamaoka
 
【Microsoft Conference Japan Tour 2010】 T4-2 クラウド時代を迎えたソフトウェア開発における現場力の向上
【Microsoft Conference Japan Tour 2010】 T4-2 クラウド時代を迎えたソフトウェア開発における現場力の向上【Microsoft Conference Japan Tour 2010】 T4-2 クラウド時代を迎えたソフトウェア開発における現場力の向上
【Microsoft Conference Japan Tour 2010】 T4-2 クラウド時代を迎えたソフトウェア開発における現場力の向上智治 長沢
 
ジーノ先生の文系的オブジェクト指向(2) - コンストラクタの引数
ジーノ先生の文系的オブジェクト指向(2) - コンストラクタの引数ジーノ先生の文系的オブジェクト指向(2) - コンストラクタの引数
ジーノ先生の文系的オブジェクト指向(2) - コンストラクタの引数Satoru Kodaira
 
第1回 モデリング勉強会
第1回 モデリング勉強会第1回 モデリング勉強会
第1回 モデリング勉強会hakoika-itwg
 
eXtremeProgramming入門
eXtremeProgramming入門eXtremeProgramming入門
eXtremeProgramming入門You&I
 
カンバンゲーム
カンバンゲームカンバンゲーム
カンバンゲームYasui Tsutomu
 
アート・オブ・アジャイル デベロップメント 〜テストが駆動するビジネス価値〜
アート・オブ・アジャイル デベロップメント 〜テストが駆動するビジネス価値〜アート・オブ・アジャイル デベロップメント 〜テストが駆動するビジネス価値〜
アート・オブ・アジャイル デベロップメント 〜テストが駆動するビジネス価値〜Fumihiko Kinoshita
 
テストコードの定型化
テストコードの定型化テストコードの定型化
テストコードの定型化Shinichi Hirauchi
 
TDDBC osaka 2012/06/02
TDDBC osaka 2012/06/02TDDBC osaka 2012/06/02
TDDBC osaka 2012/06/02Hiro Yoshioka
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織Takafumi ONAKA
 
トランザクションスクリプトのすすめ
トランザクションスクリプトのすすめトランザクションスクリプトのすすめ
トランザクションスクリプトのすすめpospome
 

Semelhante a 20130603 aspnet勉強会 実践的debugging (20)

パネルディスカッション資料(公開版)
パネルディスカッション資料(公開版)パネルディスカッション資料(公開版)
パネルディスカッション資料(公開版)
 
仕様七変化
仕様七変化仕様七変化
仕様七変化
 
GCSアジャイル開発を使ったゲームの作り方
 GCSアジャイル開発を使ったゲームの作り方 GCSアジャイル開発を使ったゲームの作り方
GCSアジャイル開発を使ったゲームの作り方
 
今、おさえておきたい DevOps
今、おさえておきたい DevOps 今、おさえておきたい DevOps
今、おさえておきたい DevOps
 
#STAC2014 システムテスト自動化ハンズオン
#STAC2014 システムテスト自動化ハンズオン#STAC2014 システムテスト自動化ハンズオン
#STAC2014 システムテスト自動化ハンズオン
 
オトナのプログラミング勉強会 オトナのDeep Learning 2016-11
オトナのプログラミング勉強会 オトナのDeep Learning 2016-11オトナのプログラミング勉強会 オトナのDeep Learning 2016-11
オトナのプログラミング勉強会 オトナのDeep Learning 2016-11
 
20120927 findjob4 dev_ops
20120927 findjob4 dev_ops20120927 findjob4 dev_ops
20120927 findjob4 dev_ops
 
非開発者のためのアジャイル開発入門
非開発者のためのアジャイル開発入門非開発者のためのアジャイル開発入門
非開発者のためのアジャイル開発入門
 
Dockerを使ってローカルテストを良い感じに実装した話
Dockerを使ってローカルテストを良い感じに実装した話Dockerを使ってローカルテストを良い感じに実装した話
Dockerを使ってローカルテストを良い感じに実装した話
 
【Microsoft Conference Japan Tour 2010】 T4-2 クラウド時代を迎えたソフトウェア開発における現場力の向上
【Microsoft Conference Japan Tour 2010】 T4-2 クラウド時代を迎えたソフトウェア開発における現場力の向上【Microsoft Conference Japan Tour 2010】 T4-2 クラウド時代を迎えたソフトウェア開発における現場力の向上
【Microsoft Conference Japan Tour 2010】 T4-2 クラウド時代を迎えたソフトウェア開発における現場力の向上
 
ジーノ先生の文系的オブジェクト指向(2) - コンストラクタの引数
ジーノ先生の文系的オブジェクト指向(2) - コンストラクタの引数ジーノ先生の文系的オブジェクト指向(2) - コンストラクタの引数
ジーノ先生の文系的オブジェクト指向(2) - コンストラクタの引数
 
第1回 モデリング勉強会
第1回 モデリング勉強会第1回 モデリング勉強会
第1回 モデリング勉強会
 
eXtremeProgramming入門
eXtremeProgramming入門eXtremeProgramming入門
eXtremeProgramming入門
 
カンバンゲーム
カンバンゲームカンバンゲーム
カンバンゲーム
 
アート・オブ・アジャイル デベロップメント 〜テストが駆動するビジネス価値〜
アート・オブ・アジャイル デベロップメント 〜テストが駆動するビジネス価値〜アート・オブ・アジャイル デベロップメント 〜テストが駆動するビジネス価値〜
アート・オブ・アジャイル デベロップメント 〜テストが駆動するビジネス価値〜
 
20130320 agile pm
20130320 agile pm20130320 agile pm
20130320 agile pm
 
テストコードの定型化
テストコードの定型化テストコードの定型化
テストコードの定型化
 
TDDBC osaka 2012/06/02
TDDBC osaka 2012/06/02TDDBC osaka 2012/06/02
TDDBC osaka 2012/06/02
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 
トランザクションスクリプトのすすめ
トランザクションスクリプトのすすめトランザクションスクリプトのすすめ
トランザクションスクリプトのすすめ
 

20130603 aspnet勉強会 実践的debugging