C#プログラマーのための デバッグの基本&応用テクニック

[表紙]C#プログラマーのための デバッグの基本&応用テクニック

紙版発売
電子版発売

A5判/360ページ

定価2,948円(本体2,680円+税10%)

ISBN 978-4-7741-8467-8

電子版

→学校・法人一括購入ご検討の皆様へ

書籍の概要

この本の概要

完璧なプログラムなどありません。思わぬ不具合が現れたりもします。プログラミングはバグとの戦いでもあります。ましてビジネスであれば可能な限りバグを潰すことが絶対に必要です。しかし,バグ取りは奥が深く,かなりの経験がないと,なかなかできるようになりません。標準的な教科書もありません。つまり,新人は,なかなか学ぶ機会が得られないのです。著者の川俣氏はプログラム開発においてもバグ取りにおいても非常に豊富な経験を持っています。誰もが諦めるような不具合を潰してきたことも一度や二度ではありません。氏によれば,プログラムの原理を理解し,ある程度のコツをつかめば,かなりの確率でバグを潰せるようになるとのこと。本書で,そういったプログラマーに必須のコツを伝授します。

こんな方におすすめ

  • C#を使った開発に従事しているプログラマー
  • 入門から実践に入ったあたりのC#プログラマー

目次

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 バグが出ても安全側に倒すフェイルセーフの考え方

Epilogue

Debugpedia デバッグ用語集

Index