Debug Hacks
――デバッグを極めるテクニック&ツール

[cover photo]
  • 2009年04月 発行
  • 424ページ
  • ISBN978-4-87311-404-0
  • フォーマット Print PDF

オライリー・ジャパンで書籍を購入:
定価3,456円

Ebook Storeで電子版を購入:
価格2,764円

ミラクル・リナックス株式会社の精鋭エンジニアたちが、長年のLinuxカーネル開発の経験で培ったデバッグテクニックを詳解。こころがまえから、準備、必要な知識、バグの原因をすばやく特定し修正するために便利なテクニックとツール、高度なデバッグ技まで惜しみなく披露します。多くの事例に基づいた実際的実用的な技が満載です。効率良くかつクオリティーの高い開発のために必須の一冊です。


Debug Hacks推薦の言葉

 プログラムにはバグが付き物です。バグは人間の予想を超えたところからやってきます。世界最初のバグは、リレー式計算機の中にまぎれこんだ蛾だったそうです。あわれリレーの間に挟まれた蛾によってコンピュータの誤動作が引き起こされました。このエピソードがきっかけとなり、プログラムの間違いのことがバグと呼ばれるようになったのだそうです。この蛾は後にCOBOLの開発者となるグレース・ホッパー女史の日記に記念として張りつけられていたと聞きます。

 それから半世紀以上が過ぎ、あいかわらずバグは生み出され続けています。「プログラムは思った通りではなく、書いた通りに動く」というのはプログラマの中に伝わる「ことわざ」のひとつです。そして人間は間違えるものなので、プログラムの中にはバグが入り込みます。ある意味、バグとは人間の限界を見せつけてくれるものなのかもしれません。ほとんどのバグはちょっとプログラマを悩ませるくらいのかわいいものですが、最近はバグによって引き起こされた「事件」によって新聞をにぎわすようなこともたびたび起きています。

 プログラマの仕事はプログラムを作ることですが、コンピュータが社会に浸透し、プログラムが複雑化するに従って、完全なプログラムを書くことは非常に困難になってきています。その結果、すべてのプログラマは必然的にバグに対処する必要があります。個人的にはプログラマの時間の大半が、バグを見つけることと、それらを直すことに費やされているのではないかと感じます。

 しかし、ただやみくもにバグを探してもうまくいくわけはありません。バグにはバグの見つけ方があり、直し方があるのです。特にバグを見つけだし、特定するにはさまざまなテクニックが存在します。「デバッグ」という言葉は「バグを直すこと」のような印象がありますが、実際にはどこにあるのか特定されたバグはまったく恐ろしいものではなく、たいていはすぐに直すことができるものです。デバッグの神髄はバグの発見と特定にあるのです。本書は歴戦のプログラマが経験から獲得したバグの見つけ方・直し方が満載されています。特に普段はお目にかからないようなLinuxそのもののバグについてのHackは、貴重な情報ではないかと思います。いくつかのHackは多くのプログラマが日常的に使うものではないかもしれませんが、それでもなおその発想は参考になります。特にgdbやvalgrindやoprofileのような便利なツールについてきちんと解説してあるのがありがたいところです。また、2つほどRubyの「バグ」についても扱っていただいてます。ありがたいことです。

 本書がプログラマの皆さんのバグへの戦いの日々が少しでも楽になるための「道標」となることを期待しています。

2009年3月 羽田空港にて
まつもとゆきひろ

関連書籍

Binary Hacks
GDBハンドブック
詳解 Linuxカーネル 第3版

推薦の言葉
クレジット
はじめに
1章 こころがまえ(warmingup)
    1. デバッグとは
    2. Debug Hacksマップ
    3. デバッグの心得
2章 デバッグ前に知っておくべきこと
    4. プロセスのコアダンプを採取する
    5. デバッガ(GDB)の基本的な使い方(その1)
    6. デバッガ(GDB)の基本的な使い方(その2)
    7. デバッガ(GDB)の基本的な使い方(その3)
    8. Intelアーキテクチャの基本
    9. デバッグに必要なスタックの基礎知識
    10. 関数コール時の引数の渡され方(x86_64編)
    11. 関数コール時の引数の渡され方(i386編)
    12. 関数コール時の引数の渡され方(C++編)
    13. アセンブリ言語の勉強法
    14. アセンブリ言語からソースコードの対応を調べる
3章 カーネルデバッグの準備
    15. Oopsメッセージの読み方
    16. minicomでシリアルコンソール接続を行う
    17. ネットワーク経由でカーネルメッセージを取得する
    18. SysRqキーによるデバッグ方法
    19. diskdumpを使ってカーネルクラッシュダンプを採取する
    20. Kdumpを使ってカーネルクラッシュダンプを採取する
    21. crashコマンドの使い方
    22. IPMI watchdog timerにより、フリーズ時にクラッシュダンプを取得する
    23. NMI watchdogにより、フリーズ時に
    クラッシュダンプを取得する
    24. カーネル特有のアセンブリ命令(その1)
    25. カーネル特有のアセンブリ命令(その2)
4章 実践アプリケーションデバッグ
    26. SIGSEGVでアプリケーションが異常終了した
    27. バックトレースが正しく表示されない
    28. 配列の不正アクセスによるメモリ内容の破壊
    29. ウォッチポイントを活用した不正メモリアクセスの検知
    30. malloc()やfree()で障害が発生
    31. アプリケーションのストール(デッドロック編)
    32. アプリケーションのストール(無限ループ編)
5章 実践カーネルデバッグ
    33. カーネルパニック(NULLポインタ参照編)
    34. カーネルパニック(リスト破壊編)
    35. カーネルパニック(レースコンディション編)
    36. カーネルのストール(無限ループ編)
    37. カーネルのストール(スピンロック編その1)
    38. カーネルのストール(スピンロック編その2)
    39. カーネルのストール(セマフォ編)
    40. リアルタイムプロセスのストール
    41. 動作がスローダウンする不具合
    42. CPU負荷が高くなる不具合
6章 差がつくデバッグテクニック
    43. straceを使って、不具合原因の手がかりを見つける
    44. objdumpの便利なオプション
    45. Valgrindの使い方(基本編)
    46. Valgrindの使い方(実践編)
    47. kprobesを使って、カーネル内部の情報を取得する
    48. jprobesを使って、カーネル内部の情報を取得する
    49. kprobesを使って、カーネル内部の任意箇所の情報を取得する
    50. kprobesを使って、カーネル内部の任意箇所で変数名を指定して情報を取得する
    51. KAHOを使い、コンパイラによってOptimized outされた変数の値を取得する
    52. systemtapを使って動作中のカーネルをデバッグする(その1)
    53. systemtapを使って動作中のカーネルをデバッグする(その2)
    54. /proc/meminfoでわかること
    55. /proc/<PID>/memでプロセスのメモリ内容を高速に読み出す
    56. OOM Killerの動作と仕組み
    57. フォルト・インジェクション
    58. フォルト・インジェクションを利用したLinuxカーネルの潜在的なバグの発見
    59. Linuxカーネルのinitセクション
    60. 性能の問題を解決する
    61. VMware Vprobeを使用して情報を取得する
    62. Xenでメモリダンプを取得する
    63. GOT/PLTを経由した関数コールの仕組みを理解する
    64. initramfsイメージをデバッグ
    65. RT Watchdogを使ってリアルタイムプロセスのストールを検知する
    66. 手元のx86マシンが64ビットモード対応かどうかを調べる

付録 Debug Hacks用語の基礎知識

索引

ここで紹介する正誤表には、書籍発行後に気づいた誤植や更新された情報を掲載しています。以下のリストに記載の年月は、正誤表を作成し、増刷書籍を印刷した月です。お手持ちの書籍では、すでに修正が施されている場合がありますので、書籍最終ページの奥付でお手持ちの書籍の刷版、刷り年月日をご確認の上、ご利用ください。

1刷正誤表

Debug Hacks 第1刷正誤表

2009年5月11日更新

位置
p29
8行目
(アセンブリ命令)ごとの実行したい (アセンブリ命令)ごとの実行したい
p29
頁中央
到達しなければ実行を終了すかなどします。 到達しなければ実行を終了すかなどします。
p29
下から
9行目
continute 5 continue 5
p47
図2-2
キャプション
図2-2 リトルンディアン 図2-2 リトルンディアン
p52
図2-11
クワッワード クワッワード
p67
図2-15
最下部
0x4006a 0x4006a3
p164
12行目
「配列の不正アクセスによるメモリ内容の破壊」[HACK #28] 「ウォッチポイントを活用した不正メモリアクセスの検知」[HACK #29]
p223
ヒント
2行目
EFLAGSレジスタの10番目のビットです。 EFLAGSレジスタの9ビット目です。
p226
13-15
行目
spin_unlock(&desc->lock);
handle_IRQ_event(i, regs, action);
spin_lock(&desc->lock); ---⑧
spin_unlock(&desc->lock); ---⑧
handle_IRQ_event(i, regs, action);
spin_lock(&desc->lock); 

Feedback

皆さんのご意見をお聞かせください。ご購入いただいた書籍やオライリー・ジャパンへのご感想やご意見、ご提案などをお聞かせください。より良い書籍づくりやサービス改良のための参考にさせていただきます。
[feedbackページへ]