0
#ccc_h4
Java デバッガ活用術
∼勘デバッグ・print デバッグから抜けだそう∼
@yusuke
株式会社サムライズム 山本裕介
#ccc_h4
【デバッグ】
デバッグ (debug) とはコンピュータプログラムや電
気機器中のバグ・欠陥を発見および修正し、動作を
仕様通りのものとするための作業である。サブシス
テムが密結合であると、1箇所の変更が別の箇所での
バグを作り...
#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...
#ccc_h4
ブレークポイントで良くある問題
• ループ内をデバッグしたい!
• ブレークポイントを設定するが問題発生まで何
回もブレークしてしまう!
#ccc_h4
ブレークポイントで良くある問題
• ループ内をデバッグしたい!
• ブレークポイントを設定するが問題発生まで何
回もブレークしてしまう!
ヒットカウント / 条件付ブレークポイント
#ccc_h4
ヒットカウント / 条件付ブレークポイント
#ccc_h4
ヒットカウント / 条件付ブレークポイント
#ccc_h4
ヒットカウント / 条件付ブレークポイント
#ccc_h4
リモートデバッグ
#ccc_h4
リモートデバッグ
• JPDA(Java Platform Debugger Architecture)!
• デバッグをするための標準インタフェース!
• IDE上で実行/デバッグする際も利用!
• IDE外、リモートマシンの...
#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...
#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 Time...
#ccc_h4
ありがとうございました
@yusuke
Upcoming SlideShare
Loading in...5
×

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

16,286

Published on

Published in: Technology
0 Comments
57 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
16,286
On Slideshare
0
From Embeds
0
Number of Embeds
12
Actions
Shares
0
Downloads
88
Comments
0
Likes
57
Embeds 0
No embeds

No notes for slide

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

  1. 1. #ccc_h4 Java デバッガ活用術 ∼勘デバッグ・print デバッグから抜けだそう∼ @yusuke 株式会社サムライズム 山本裕介
  2. 2. #ccc_h4 【デバッグ】 デバッグ (debug) とはコンピュータプログラムや電 気機器中のバグ・欠陥を発見および修正し、動作を 仕様通りのものとするための作業である。サブシス テムが密結合であると、1箇所の変更が別の箇所での バグを作り出すので、バグの修正がより困難となる。 http://ja.wikipedia.org/wiki/デバッグ より
  3. 3. #ccc_h4 バグ発見のタイミング • コーディング中! • ユニットテスト中! • CI環境! • 結合/ステージング環境! • プロダクション環境 早 遅
  4. 4. #ccc_h4 デバッグの難易度 • コーディング中! • ユニットテスト中! • CI環境! • 結合/ステージング環境! • プロダクション環境 低 高 デバッガが活躍
  5. 5. #ccc_h4 デバッガ vs ユニットテスト
  6. 6. #ccc_h4 デバッガ vs ユニットテスト • ユニットテスト! • 実装が期待通りに動くことを確認! • インプットに対して期待するアウトプットが 出るか
  7. 7. #ccc_h4 デバッガ vs ユニットテスト • デバッガ! • 期待通りに動いていない 実装を掘り下げる! • 多量のdebug / print文でコードを汚さない
  8. 8. #ccc_h4 デバッガ vs ユニットテスト • ユニットテストでデバッグ! • デバッグ目的でユニットテスト作成! • 粒度が細かくなりすぎことも! • ユニットテストはリグレッションを発見できる 最低限のセット! • ロジックの確認、デバッグはデバッガで
  9. 9. #ccc_h4 デバッグの方法 • 再現条件の確認! • テストケースの作成! • 当該コードの修正 非常にむずかしい デバッガで確認
  10. 10. #ccc_h4 デバッガの活用
  11. 11. #ccc_h4 デバッガのしてくれること • プログラムを任意の箇所で一時停止! • ステップ実行! • 即時評価! • 値の書き換え 等々
  12. 12. #ccc_h4 デバッガがしてくれないこと • パフォーマンスボトルネックの発見! • タイミングissueの原因究明! • 結合箇所の問題発見
  13. 13. #ccc_h4 今日説明すること • ラインブレークポイント! • ステップ実行! • 条件付ブレークポイント! • 式評価 / ウォッチ
  14. 14. #ccc_h4 行ブレークポイント、ステップ実行 • 指定した行に到達するとプログラムが一時停止! • (ダブル)クリック/ショートカットでブレークポ イント設定!
  15. 15. #ccc_h4 step over / step into • step over! • 現在のクラスをステップ実行! • step into! • クラスメソッド内に潜り込んでステップ実行
  16. 16. #ccc_h4 resume / continue • resume / continue! • ブレーク中のスレッドを再開! • 次のブレークポイントまで動作
  17. 17. #ccc_h4 ブレーク中に出来る主なこと • 変数の値の確認! • 変数の値の変更! • 式評価
  18. 18. #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
  19. 19. #ccc_h4 ブレークポイントで良くある問題 • ループ内をデバッグしたい! • ブレークポイントを設定するが問題発生まで何 回もブレークしてしまう!
  20. 20. #ccc_h4 ブレークポイントで良くある問題 • ループ内をデバッグしたい! • ブレークポイントを設定するが問題発生まで何 回もブレークしてしまう! ヒットカウント / 条件付ブレークポイント
  21. 21. #ccc_h4 ヒットカウント / 条件付ブレークポイント
  22. 22. #ccc_h4 ヒットカウント / 条件付ブレークポイント
  23. 23. #ccc_h4 ヒットカウント / 条件付ブレークポイント
  24. 24. #ccc_h4 リモートデバッグ
  25. 25. #ccc_h4 リモートデバッグ • JPDA(Java Platform Debugger Architecture)! • デバッグをするための標準インタフェース! • IDE上で実行/デバッグする際も利用! • IDE外、リモートマシンのJVMをデバッグ可能
  26. 26. #ccc_h4 リモートデバッグの方法 • Javaの実行オプションを追加 -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 “y”にするとデバッガアタッチまで待つ デバッガがリスンするポート
  27. 27. #ccc_h4 デバッガのアタッチ
  28. 28. #ccc_h4 デバッガのアタッチ
  29. 29. #ccc_h4 デバッガのアタッチ
  30. 30. #ccc_h4 プロダクション環境のデバッグ • パフォーマンス! • セキュリティ
  31. 31. #ccc_h4 プロダクション環境のデバッグ • パフォーマンス! • デバッグ有効化はパフォーマンス影響なし! • アタッチ時は影響有り! • ホットスポットに条件付ブレークポイント を設定する場合は注意
  32. 32. #ccc_h4 プロダクション環境のデバッグ • セキュリティ! • 大変脆弱 / 認証機構はない! • 不要な場合は無効に
  33. 33. #ccc_h4 プロダクション環境のデバッグ • セキュリティ! • 大変脆弱 / 認証機構はない! • 不要な場合は無効に! • プロダクション環境ではリスンアドレスを指定! ! ! • リモート接続はsshトンネル経由で -agentlib:jdwp=transport=dt_socket,server=y, suspend=n,address=localhost:5005
  34. 34. #ccc_h4 デバッグあるある問題
  35. 35. #ccc_h4 デバッガあるある問題 • ここだ!とブレークポイント設定!
  36. 36. #ccc_h4 デバッガあるある問題 • ここだ!とブレークポイント設定! • 事件はブレークポイント以前で起きていた!!
  37. 37. #ccc_h4 デバッガあるある問題 • ここだ!とブレークポイント設定! • 事件はブレークポイント以前で起きていた!! • もっと手前にブレークポイント設定!
  38. 38. #ccc_h4 デバッガあるある問題 • step実行、step実行・・・! !
  39. 39. #ccc_h4 デバッガあるある問題 • step実行、step実行・・・! ! ! ! • 飛び越した!step intoしておくべきだった・・!
  40. 40. #ccc_h4 デバッグあるある問題 • Jenkins/Bamboo/TeamCityなどCI環境でのみ再現! • たまにしか再現しない! • print文を入れたら再現しない! • 他システムとの結合箇所でまれに失敗! • 再現条件がよくわからずテストが書けない! • 小人さんが直してくれていた(みたい)
  41. 41. #ccc_h4 一般的な解決方法
  42. 42. #ccc_h4 一般的な解決方法 • 超能力を使う! • 超能力を使う! • 超能力を使う! • 超能力を使う! • 超能力を使う! • 超能力を使う
  43. 43. #ccc_h4 超能力を持ち合わせていない方
  44. 44. #ccc_h4 Chronon Time Travellingデバッガ • Chronon Systems, LLC.
  45. 45. #ccc_h4 デモ
  46. 46. #ccc_h4 でもお高いんでしょ?
  47. 47. #ccc_h4 IntelliJ IDEAを持っていれば無料!
  48. 48. #ccc_h4 他の使い方 • CI環境で稀に発生するバグの記録を後で確認! • プロダクション環境で記録! • Chronon Recording Server! • 記録し続けてローテート、最長n日保存! • 任意のタイミングで記録開始・停止! • パフォーマンスオーバーヘッド:低
  49. 49. #ccc_h4 まとめ • デバッガを利用するタイミング! • デバッグ時!! • 一時的なデバッグ用のデバッグ文は入れない! • ショートカット、条件付ブレークポイントで効 率的にデバッグ! • オフラインデバッグにはChronon Timetravelling デバッガ
  50. 50. #ccc_h4 ありがとうございました @yusuke
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×