目次
Prologue
Chapter 1 バグの典型的な症状
- 1.1 ハングアップ
- アプリのハングアップ
- システムのハングアップ
- 1.2 終了してしまう
- 1.3 終了してもプロセスが残る
- 1.4 表示位置がずれる
- 1.5 正しくない文字/文字列が出力される
- 文字が違う
- 数値が違う
- 言語が違う
- ロケールが違う
- 文字列の並び順の違い
- 誤訳による場合
- 1.6 ファイル等のロックがいつまでも解放されない
- 1.7 間違ったタイミングでリアクションする
- 1.8 告知する手段を間違える
- 1.9 意図しない例外が発生する
- 1.10 ブルースクリーンが発生する
Chapter 2 バグの典型的な出現ケース
- 2.1 開発環境との相違
- 2.2 初期値
- 2.3 画面解像度の違い
- 2.4 メモリ容量の違い
- 2.5 環境のバージョン間非互換性
- 2.6 通信回線の不調
- 2.7 サーバーがエラーを返す
Chapter 3 バグの典型的な例
- 3.1 名前の取り違え
- 3.2 綴りのミス
- 3.3 境界値のミス
- 3.4 副作用の勘違い
- 3.5 nullのまま走る
- 3.6 別のオブジェクトの参照
- 3.7 意図しないメソッドの呼び出し
- 3.8 アルゴリズムの誤用
- 3.9 仕様変更に気付かない
- 3.10 たまたま動いていただけ
- 3.11 型の制約ミス
- 3.12 環境の変化に追従できない
- 3.13 暗黙の前提の侵犯
- 3.14 取れないバグ
- 「できません」という結末
- ソースコードは必要か?
- ソースコードは存在するのか?
- ソースコードがあればよいのかという問題
- 再現性の問題
- OSのバグという問題
- ライブラリのバグという問題
- 別の機能で実現する
- OSS開発者との交渉
- ドライバのバグという問題
- ハードのバグという問題
- 通信が遮断される問題
- 外部サービスの停止,休止という問題
- 論理的に取れないバグ
- 取れないバグの分類とまとめ
Chapter 4 クラウド特有のバグ
- 4.1 環境の自動移行
- 4.2 実環境とエミュレーションの違い
Chapter 5 バグの取り方
- 5.1 デバッグの手順
- バグレポート
- 再現手順の確立
- 修正
- 検証
- コミット
- リリース
- 5.2 printfデバッグ
- 5.3 ブレークポイント
- 通過したことを確認する
- スタックトレースを確認する
- 引数/変数の値を確認する
- 通過しなかったことを確認する
- 5.4 条件付きブレークポイント
- 5.5 ステップ実行
- 5.6 結果の静的解析
- 5.7 クラウドとリモートデバッグ
- 5.8 ネストした例外の確認
- 5.9 発生個所≠キャッチ場所という問題
- 5.10 静的コンストラクタで起きた例外の把握
- 5.11 2点間で挟み込んで範囲を確定する
Chapter 6 問題を察知する方法
- 6.1 例外の自動レポートの例
- 本体
- 例外レポーター
- デザイン部分
- 6.2 プログラム実行を動的に監視する
- 6.3 Application Insightという解決策
Chapter 7 修正が難しい各種バグ
- 7.1 ハイゼンバグ(Heisenbugs)
- ハイゼンバグとは何か?
- デバッグビルドでは発生しない場合
- デバッガ上では発生しない場合
- 開発者のマシンでは発生しない場合
- 単体テストでは発生しない場合
- printfデバッグを行うと発生しない場合
- 7.2 ボーアバグ(Bohrbugs)
- ボーアバグとは何か?
- 7.3 マンデルバグ(Mandelbugs)
- マンデルバグとは何か?
- 7.4 シュレーディンバグ(Schroedinbugs)
- シュレーディンバグとは何か?
- 7.5 アリストテレス(Aristotle)
- アリストテレスとは何か?
- 7.6 月の相バグ(Phase of the Moon Bugs)
- 月の相バグとは何か?
Chapter 8 デバッグ後のバージョンの提供方法
- 8.1 アップデートという問題
- 8.2 自動バージョンアップ
- 8.3 任意と半強制と強制バージョンアップ
- ClickOnceという技術
- 8.4 自動バージョンアップが拒否される問題
- 8.5 自動バージョンアップのタイミング
- 8.6 バージョンダウンの重要性
- バージョンダウンができないWebアプリの問題
- 8.7 バグ取りが非互換性を生む問題
- 8.8 セキュリティホールが非互換性を生む問題
Chapter 9 バージョン管理
- 9.1 バージョン管理システムとは何か?
- 9.2 排他ロックの問題
- 9.3 チェックイン対マージの問題
- 9.4 分岐の問題
- 9.5 マージの問題
- 9.6 ロールバックの活用
- 9.7 ソースコードリポジトリをどうするか?
- リポジトリのバックアップ
- 管理コストの問題
- 差分をどこまでトラッキングするか?
Chapter 10 バグトラッキングデータベース
- 10.1 バグトラッキングデータベースとは何か?
- 10.2 バグトラッキングデータベースの機能
- 10.3 バグトラッキングデータベースの利用サイクル
- 10.4 再アサインの重要性
- 10.5 問題の統合
- 10.6 問題の派生
- 10.7 バグトラッキングデータベースが機能しないとき
- 10.8 簡易管理
Chapter 11 バグレポート作成者側の心構え
- 11.1 書き方
- 11.2 管理
- 11.3 モチベーション
- 11.4 素人の曖昧なレポートへの対処
Chapter 12 デバッグに当たっての心構え
- 12.1 トイレデバッグ,食事デバッグ,風呂デバッグ
- 12.2 バグ取りは楽しい
- 12.3 バグ取りで怒りが出るとき
- 12.4 バグ取りはチャレンジだ
- 12.5 再現できないバグ
- 12.6 決める勇気
- 12.7 コメントは信頼できるか?
- 12.8 頑張りすぎるな
- 12.9 取れないバグはない! トラップで受け止めろ
Appendix バグを出さない方法
- A.1 単体テスト
- A.2 テスト駆動開発
- A.3 ライブラリの信頼性の判定
- OSSは信頼性が高いといえるのか?
- A.4 テストの完全性とテスト時間の問題
- A.5 バグが出ても安全側に倒すフェイルセーフの考え方