Entry

今日買った本 - 『Debug Hacks』

2009年04月27日

読もうと心に決めていたので,平積みになってるのを立ち読みせずに購入。帰りの電車で 4/5 くらい読みました。

Debug Hacks -デバッグを極めるテクニック&ツール
吉岡 弘隆 大和 一洋 大岩 尚宏 安部 東洋 吉田 俊輔
オライリージャパン
売り上げランキング: 330

本書はその名の通り,デバッグを扱った本です。プログラミングにデバッグはつき物なんですけれど,デバッグを扱った本は,意外と少なかったりします。んなもんで,本書はそれだけで貴重な本。周りを見ても,「もっと効果的で効率的なデバッグ手法があるんじゃないか?」と疑いつつ,自己流のデバッグを続けている人が割といるので,需要もあるんだと思います。

ただ,本書の場合,ターゲットがものすごく狭い。扱ってる話題が比較的低水準で高度だってのもあるんですけど,それ以前にデバッグするターゲットが限定されすぎている感があります。万人向けではない特徴は,こんなもの。

  • C/C++ のデバッグ手法を扱っている
  • アセンブリの知識は少し必要(解説あり)
  • プラットフォームは Intel x86 アーキテクチャの Linux
  • カーネルデバッグの話題が本書の半分を占めている
  • 処理系は GCC のみ
  • アプリケーションのデバッグも基本はカーネル(メモリ)周り

かなり対象を絞ってるなぁ……。ばっちり当てはまる人がいるんだろうか,と心配になってしまう。

つことで,順番にレビュー。あまりレビューになってないんですが。

まず,1章「こころがまえ(warmingup)」と2章「デバッグ前に知っておくべきこと」については,C/C++ でプログラミングする人には,ある意味常識的な話なので,さらっと流せると思います。GDB の使い方を詳しく説明してくれるので,使ったことがない向きには便利かも。また,スタックフレームの基礎事項や C/C++ からアセンブリへの橋渡し(分析・デバッグ)の方法を,順を追って説明してくれているところも,とても丁寧で勉強になります。

ほんの少しだけ欲を言うと,関数呼び出し(引数渡し)の箇所で,せっかく cdecl と fastcall のような呼び出し規約に突っ込んでくれたのだから,少しだけでも他の呼び出し規約も紹介してくれたら良かったんじゃないかと思います。本書は Linux だけを対象にしているから仕方がないのかもしれないけれど,Windows API では stdcall も普通に使われているので,ここでの引数渡しをそのまま Windows プログラムのデバッグに当てはめることはできません。ちと残念。

続いて3章「カーネルデバッグの準備」と5章「実践カーネルデバッグ」については,文字通り Linux カーネルのデバッグ手法を説明しています。あたしゃ普段 FreeBSD BOX を使っているので(壊れてたけど復活した),似たような環境にいることはいるんですけれど,正直他人事にせざるを得ませんでした。あー……向こうの人はこうやってるのね,くらいで。

もっとも,3章の HACK#24「カーネル特有のアセンブリ命令(その1)」あたりについては,普段見慣れないニモニックの説明があって,興味深く読ませてもらいました。FreeBSD ではどうやって叩いてるんだろ。

一方,4章「実践アプリケーションデバッグ」は割と他の UN*X ユーザにも役に立ちそうです。GDB をゴリゴリ使って具体的に(Ruby を)デバッグしています。また,これは個人的に役に立ったんですけれど,マルチスレッドのデバッグでスタック破壊のケースを扱っている箇所はとても分かりやすかった。スタックに関する基本的な知識を元にして,スレッドの挙動を丁寧に読み解いています。ちゃんと図を描けば分かりやすくなるんですけどね。あたしには,こゆ図を想定する頭が用意できていないのだった。

大変興味深く読ませてもらったこの章なんですけれど,残念ながら,あっという間に終わってしまった(泣)。

最後の6章はツールや tips の類が集まった「差がつくデバッグテクニック」です。これはまだ読んでない……ざっと読んだところでは BINARY HACKS++ といったところだろうか。違うな,きっと。

本書は多分,デバッグだけでなく C/C++ でプログラミングする上でも,とても勉強になるんだと思います。おそらく,C/C++ でプログラミングしている方は,関数を作るときも「ここでスタックを積んで……」みたいにプログラミングしているはず。つか,あたしがそうなんですが。で,デバッグするってのは,そうした挙動を逐一追っていく作業なわけで,C/C++ をやっている人には「自分がやってること」を把握するいい機会になるんじゃないかと思います。その意味で言うと,本書はデバッグ本というよりは,プログラミング本やカーネルの動作解説本に近い。

一方,純粋なデバッグ本として見た場合,足りないと思うところがちらほらとある気がします。中でも特に足りないと思ったのが,「数値計算」に関するバグです。

著者さんが,カーネルを開発ターゲットにしているからあまりピンとこないのかもしれないんですけれど,巷のバグには数値計算にまつわるバグが,殊の外多いと感じています。このバグには,古典的な丸め誤差や打切り誤差のといった誤差にまつわるバグはもちろん(しょうがないこともあるんだが),big decimal のような数値(クラス)の定義そのものにまつわるバグなんかが含まれます。こうしたバグは,segmentation fault のような派手目なエラーをかましてくれることもなく,一見すると正常に終了してしまうことから,原因を突き止めるのにとても難儀する。「なんか結果が変……」みたいなモヤモヤしたところで,「バグなのか……?」とか思いつつデバッグ(っぽいこと)に着手する,みたいなことがあったりします。

万人向けのデバッグ本を作るのは難しいな,と,本書を読んでて思った次第。そう考えれば,本書は割り切っていて,むしろすがすがしいとも思えるんですけどね。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN