View
12.887
Download
2
Category
Preview:
DESCRIPTION
Citation preview
#ccc_h4
Java デバッガ活用術
~勘デバッグ・print デバッグから抜けだそう~
@yusuke
株式会社サムライズム 山本裕介
#ccc_h4
【デバッグ】デバッグ (debug) とはコンピュータプログラムや電気機器中のバグ・欠陥を発見および修正し、動作を仕様通りのものとするための作業である。サブシステムが密結合であると、1箇所の変更が別の箇所でのバグを作り出すので、バグの修正がより困難となる。
http://ja.wikipedia.org/wiki/デバッグ より
#ccc_h4
バグ発見のタイミング• コーディング中!
• ユニットテスト中!
• CI環境!
• 結合/ステージング環境!
• プロダクション環境
早
遅
#ccc_h4
デバッグの難易度• コーディング中!
• ユニットテスト中!
• CI環境!
• 結合/ステージング環境!
• プロダクション環境
低
高
デバッガが活躍
#ccc_h4
デバッガ vs ユニットテスト
#ccc_h4
デバッガ vs ユニットテスト• ユニットテスト!
• 実装が期待通りに動くことを確認!
• インプットに対して期待するアウトプットが出るか
#ccc_h4
デバッガ vs ユニットテスト• デバッガ!
• 期待通りに動いていない 実装を掘り下げる!
• 多量のdebug / print文でコードを汚さない
#ccc_h4
デバッガ vs ユニットテスト• ユニットテストでデバッグ!
• デバッグ目的でユニットテスト作成!
• 粒度が細かくなりすぎことも!
• ユニットテストはリグレッションを発見できる最低限のセット!
• ロジックの確認、デバッグはデバッガで
#ccc_h4
デバッグの方法• 再現条件の確認!
• テストケースの作成!
• 当該コードの修正
非常にむずかしい
デバッガで確認
#ccc_h4
デバッガの活用
#ccc_h4
デバッガのしてくれること• プログラムを任意の箇所で一時停止!
• ステップ実行!
• 即時評価!
• 値の書き換え
等々
#ccc_h4
デバッガがしてくれないこと• パフォーマンスボトルネックの発見!
• タイミングissueの原因究明!
• 結合箇所の問題発見
#ccc_h4
今日説明すること• ラインブレークポイント!
• ステップ実行!
• 条件付ブレークポイント!
• 式評価 / ウォッチ
#ccc_h4
行ブレークポイント、ステップ実行• 指定した行に到達するとプログラムが一時停止!
• (ダブル)クリック/ショートカットでブレークポイント設定!
#ccc_h4
step over / step into• step over!
• 現在のクラスをステップ実行!
• step into!
• クラスメソッド内に潜り込んでステップ実行
#ccc_h4
resume / continue• resume / continue!
• ブレーク中のスレッドを再開!
• 次のブレークポイントまで動作
#ccc_h4
ブレーク中に出来る主なこと• 変数の値の確認!
• 変数の値の変更!
• 式評価
#ccc_h4
ショートカット一覧Eclipse NetBeans IntelliJ IDEA
ブレークポイント設定 Shift+⌘+B ⌘ + F8 ⌘ + F8ブレークポイント一覧 ⌥+⌘+Q→B Shift+Ctrl+5 Shift+⌘+F8
デバッグ実行 ⌘ + F11 ⌘ + F5 Shift+Ctrl+F9step over F6 F8 F8step into F5 F7 F7
resume/continue F8 F5 F9
式評価Window > Show View > Expressions
⌘ + F9 ⌥ + F8
#ccc_h4
ブレークポイントで良くある問題• ループ内をデバッグしたい!
• ブレークポイントを設定するが問題発生まで何回もブレークしてしまう!
#ccc_h4
ブレークポイントで良くある問題• ループ内をデバッグしたい!
• ブレークポイントを設定するが問題発生まで何回もブレークしてしまう!
ヒットカウント / 条件付ブレークポイント
#ccc_h4
ヒットカウント / 条件付ブレークポイント
#ccc_h4
ヒットカウント / 条件付ブレークポイント
#ccc_h4
ヒットカウント / 条件付ブレークポイント
#ccc_h4
リモートデバッグ
#ccc_h4
リモートデバッグ• JPDA(Java Platform Debugger Architecture)!
• デバッグをするための標準インタフェース!
• IDE上で実行/デバッグする際も利用!
• IDE外、リモートマシンのJVMをデバッグ可能
#ccc_h4
リモートデバッグの方法• Javaの実行オプションを追加
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
“y”にするとデバッガアタッチまで待つ
デバッガがリスンするポート
#ccc_h4
デバッガのアタッチ
#ccc_h4
デバッガのアタッチ
#ccc_h4
デバッガのアタッチ
#ccc_h4
プロダクション環境のデバッグ• パフォーマンス!
• セキュリティ
#ccc_h4
プロダクション環境のデバッグ• パフォーマンス!
• デバッグ有効化はパフォーマンス影響なし!
• アタッチ時は影響有り!
• ホットスポットに条件付ブレークポイントを設定する場合は注意
#ccc_h4
プロダクション環境のデバッグ• セキュリティ!
• 大変脆弱 / 認証機構はない!• 不要な場合は無効に
#ccc_h4
プロダクション環境のデバッグ• セキュリティ!
• 大変脆弱 / 認証機構はない!• 不要な場合は無効に!
• プロダクション環境ではリスンアドレスを指定!
!
!
• リモート接続はsshトンネル経由で
-agentlib:jdwp=transport=dt_socket,server=y,\ suspend=n,address=localhost:5005
#ccc_h4
デバッグあるある問題
#ccc_h4
デバッガあるある問題• ここだ!とブレークポイント設定!
#ccc_h4
デバッガあるある問題• ここだ!とブレークポイント設定!
• 事件はブレークポイント以前で起きていた!!
#ccc_h4
デバッガあるある問題• ここだ!とブレークポイント設定!
• 事件はブレークポイント以前で起きていた!!
• もっと手前にブレークポイント設定!
#ccc_h4
デバッガあるある問題• step実行、step実行・・・!
!
#ccc_h4
デバッガあるある問題• step実行、step実行・・・!
! !
!
• 飛び越した!step intoしておくべきだった・・!
#ccc_h4
デバッグあるある問題• Jenkins/Bamboo/TeamCityなどCI環境でのみ再現!
• たまにしか再現しない!
• print文を入れたら再現しない!
• 他システムとの結合箇所でまれに失敗!
• 再現条件がよくわからずテストが書けない!
• 小人さんが直してくれていた(みたい)
#ccc_h4
一般的な解決方法
#ccc_h4
一般的な解決方法• 超能力を使う!
• 超能力を使う!
• 超能力を使う!
• 超能力を使う!
• 超能力を使う!
• 超能力を使う
#ccc_h4
超能力を持ち合わせていない方
#ccc_h4
Chronon Time Travellingデバッガ• Chronon Systems, LLC.
#ccc_h4
デモ
#ccc_h4
でもお高いんでしょ?
#ccc_h4
IntelliJ IDEAを持っていれば無料!
#ccc_h4
他の使い方• CI環境で稀に発生するバグの記録を後で確認!
• プロダクション環境で記録!
• Chronon Recording Server!
• 記録し続けてローテート、最長n日保存!
• 任意のタイミングで記録開始・停止!
• パフォーマンスオーバーヘッド:低
#ccc_h4
まとめ• デバッガを利用するタイミング!
• デバッグ時!!
• 一時的なデバッグ用のデバッグ文は入れない!
• ショートカット、条件付ブレークポイントで効率的にデバッグ!
• オフラインデバッグにはChronon Timetravellingデバッガ
#ccc_h4
ありがとうございました
@yusuke
Recommended