#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+F9
step over F6 F8 F8
step 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

Java デバッガ活用術 ~勘デバッグ・print デバッグから抜けだそう~ #jjug_ccc #ccc_h4