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

50
#ccc_h4 Java デバッガ活用術 ~勘デバッグ・print デバッグから抜けだそう~ @yusuke 株式会社サムライズム 山本裕介

description

 

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

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

#ccc_h4

Java デバッガ活用術

~勘デバッグ・print デバッグから抜けだそう~

@yusuke

株式会社サムライズム 山本裕介

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

#ccc_h4

【デバッグ】デバッグ (debug) とはコンピュータプログラムや電気機器中のバグ・欠陥を発見および修正し、動作を仕様通りのものとするための作業である。サブシステムが密結合であると、1箇所の変更が別の箇所でのバグを作り出すので、バグの修正がより困難となる。

http://ja.wikipedia.org/wiki/デバッグ より

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

#ccc_h4

バグ発見のタイミング• コーディング中!

• ユニットテスト中!

• CI環境!

• 結合/ステージング環境!

• プロダクション環境

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

#ccc_h4

デバッグの難易度• コーディング中!

• ユニットテスト中!

• CI環境!

• 結合/ステージング環境!

• プロダクション環境

デバッガが活躍

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

#ccc_h4

デバッガ vs ユニットテスト

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

#ccc_h4

デバッガ vs ユニットテスト• ユニットテスト!

• 実装が期待通りに動くことを確認!

• インプットに対して期待するアウトプットが出るか

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

#ccc_h4

デバッガ vs ユニットテスト• デバッガ!

• 期待通りに動いていない 実装を掘り下げる!

• 多量のdebug / print文でコードを汚さない

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

#ccc_h4

デバッガ vs ユニットテスト• ユニットテストでデバッグ!

• デバッグ目的でユニットテスト作成!

• 粒度が細かくなりすぎことも!

• ユニットテストはリグレッションを発見できる最低限のセット!

• ロジックの確認、デバッグはデバッガで

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

#ccc_h4

デバッグの方法• 再現条件の確認!

• テストケースの作成!

• 当該コードの修正

非常にむずかしい

デバッガで確認

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

#ccc_h4

デバッガの活用

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

#ccc_h4

デバッガのしてくれること• プログラムを任意の箇所で一時停止!

• ステップ実行!

• 即時評価!

• 値の書き換え

等々

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

#ccc_h4

デバッガがしてくれないこと• パフォーマンスボトルネックの発見!

• タイミングissueの原因究明!

• 結合箇所の問題発見

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

#ccc_h4

今日説明すること• ラインブレークポイント!

• ステップ実行!

• 条件付ブレークポイント!

• 式評価 / ウォッチ

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

#ccc_h4

行ブレークポイント、ステップ実行• 指定した行に到達するとプログラムが一時停止!

• (ダブル)クリック/ショートカットでブレークポイント設定!

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

#ccc_h4

step over / step into• step over!

• 現在のクラスをステップ実行!

• step into!

• クラスメソッド内に潜り込んでステップ実行

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

#ccc_h4

resume / continue• resume / continue!

• ブレーク中のスレッドを再開!

• 次のブレークポイントまで動作

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

#ccc_h4

ブレーク中に出来る主なこと• 変数の値の確認!

• 変数の値の変更!

• 式評価

Page 18: Java デバッガ活用術 ~勘デバッグ・print デバッグから抜けだそう~ #jjug_ccc #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

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

#ccc_h4

ブレークポイントで良くある問題• ループ内をデバッグしたい!

• ブレークポイントを設定するが問題発生まで何回もブレークしてしまう!

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

#ccc_h4

ブレークポイントで良くある問題• ループ内をデバッグしたい!

• ブレークポイントを設定するが問題発生まで何回もブレークしてしまう!

ヒットカウント / 条件付ブレークポイント

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

#ccc_h4

ヒットカウント / 条件付ブレークポイント

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

#ccc_h4

ヒットカウント / 条件付ブレークポイント

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

#ccc_h4

ヒットカウント / 条件付ブレークポイント

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

#ccc_h4

リモートデバッグ

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

#ccc_h4

リモートデバッグ• JPDA(Java Platform Debugger Architecture)!

• デバッグをするための標準インタフェース!

• IDE上で実行/デバッグする際も利用!

• IDE外、リモートマシンのJVMをデバッグ可能

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

#ccc_h4

リモートデバッグの方法• Javaの実行オプションを追加

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005

“y”にするとデバッガアタッチまで待つ

デバッガがリスンするポート

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

#ccc_h4

デバッガのアタッチ

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

#ccc_h4

デバッガのアタッチ

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

#ccc_h4

デバッガのアタッチ

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

#ccc_h4

プロダクション環境のデバッグ• パフォーマンス!

• セキュリティ

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

#ccc_h4

プロダクション環境のデバッグ• パフォーマンス!

• デバッグ有効化はパフォーマンス影響なし!

• アタッチ時は影響有り!

• ホットスポットに条件付ブレークポイントを設定する場合は注意

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

#ccc_h4

プロダクション環境のデバッグ• セキュリティ!

• 大変脆弱 / 認証機構はない!• 不要な場合は無効に

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

#ccc_h4

プロダクション環境のデバッグ• セキュリティ!

• 大変脆弱 / 認証機構はない!• 不要な場合は無効に!

• プロダクション環境ではリスンアドレスを指定!

!

!

• リモート接続はsshトンネル経由で

-agentlib:jdwp=transport=dt_socket,server=y,\ suspend=n,address=localhost:5005

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

#ccc_h4

デバッグあるある問題

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

#ccc_h4

デバッガあるある問題• ここだ!とブレークポイント設定!

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

#ccc_h4

デバッガあるある問題• ここだ!とブレークポイント設定!

• 事件はブレークポイント以前で起きていた!!

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

#ccc_h4

デバッガあるある問題• ここだ!とブレークポイント設定!

• 事件はブレークポイント以前で起きていた!!

• もっと手前にブレークポイント設定!

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

#ccc_h4

デバッガあるある問題• step実行、step実行・・・!

!

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

#ccc_h4

デバッガあるある問題• step実行、step実行・・・!

! !

!

• 飛び越した!step intoしておくべきだった・・!

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

#ccc_h4

デバッグあるある問題• Jenkins/Bamboo/TeamCityなどCI環境でのみ再現!

• たまにしか再現しない!

• print文を入れたら再現しない!

• 他システムとの結合箇所でまれに失敗!

• 再現条件がよくわからずテストが書けない!

• 小人さんが直してくれていた(みたい)

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

#ccc_h4

一般的な解決方法

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

#ccc_h4

一般的な解決方法• 超能力を使う!

• 超能力を使う!

• 超能力を使う!

• 超能力を使う!

• 超能力を使う!

• 超能力を使う

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

#ccc_h4

超能力を持ち合わせていない方

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

#ccc_h4

Chronon Time Travellingデバッガ• Chronon Systems, LLC.

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

#ccc_h4

デモ

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

#ccc_h4

でもお高いんでしょ?

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

#ccc_h4

IntelliJ IDEAを持っていれば無料!

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

#ccc_h4

他の使い方• CI環境で稀に発生するバグの記録を後で確認!

• プロダクション環境で記録!

• Chronon Recording Server!

• 記録し続けてローテート、最長n日保存!

• 任意のタイミングで記録開始・停止!

• パフォーマンスオーバーヘッド:低

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

#ccc_h4

まとめ• デバッガを利用するタイミング!

• デバッグ時!!

• 一時的なデバッグ用のデバッグ文は入れない!

• ショートカット、条件付ブレークポイントで効率的にデバッグ!

• オフラインデバッグにはChronon Timetravellingデバッガ

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

#ccc_h4

ありがとうございました

@yusuke