未来のいつか/hyoshiokの日記

hyoshiokの日々思うことをあれやこれや

Debug Hacks のamazonの書評について

Debug Hacksについてfjの教祖様にAmazon書評コメントを頂いた。どうもありがとうございます。

具体的には下記のご指摘である。引用する。

例2) p28-29「ステップ実行」2段落目「実行するものが関数などの場合、その関数の中も実行したい場合があります。そのときは、stepコマンドで行います」。おそらくここでいう「実行」は「ステップ実行」の事なのだろう。nextは「次の行に到達するまで、実行がbreakされない」が、stepは「ソースコード上の別の行に到達するまで命令レベルの実行を1つづつ実施する」。
しかしこの本の表現では「関数内部は実行されない」と読めてしまう。これでは意味が全く違なってしまう。

GDBにおける、nextコマンドとstepコマンドの違いは関数の中もステップ実行するか否かだ。Debug Hacksにおける当該箇所を全文引用してみる。

ステップ実行

ソースコードにそって、一行一行実行することをステップ実行といいます。

ソースコード一行ごとの実行はnext(nと略す)コマンドでおこなえます。実行
するものが関数などの場合、その関数の中も実行したい場合があります。その
ときは、step(sと略す)コマンドでおこないます。    ------------(1)

例えば、下記の例でprint_element (name.sysname)で実行が停止して
いたとします。stepコマンドでは、print_element ()関数内に入りこんで実
行しますが、nextコマンドの場合は、print_element ()関数を実行後、次の
行(if (toprint & PRINT_NODENAME))で実行が停止します。------------(2)

  if (toprint & PRINT_KERNEL_NAME)
    print_element (name.sysname);
  if (toprint & PRINT_NODENAME)

fjの教祖様は(1)の部分のみを引用して、『しかしこの本の表現では「関数内部は実行されない」と読めてしまう』と書かれているが、そうだろうか。nextコマンドとstepコマンドの動作の違いについて、念を入れるために(2)で、実際のコードを示して、関数内に入り込んで実行すると明記している。

いずれにせよ、nextコマンドとstepコマンドについての記述が分かりにくいというご指摘には感謝する。

もう一つのご指摘は下記である。

例1) Hack#5 p27 3段落目「Fは先に示した表示のフォーマット(.... i)、(以下略)」とあるが、「先に示した表示」にiは無い(表にiが抜けている)。

はご指摘のとおりなのであるが、表にiは意図して入れていない。すなわち『p/i アドレス』という表現はなくて、一方で『x/i アドレス』という表現があるからである。当該の表は下記である。

表示するときのフォーマットとして下記が利用できます。
p/フォーマット 変数 という形式で利用します。

'x' 16進数で表示
'd' 10進数で表示
'u' 符号なしの10進数で表示
'o' 8進数で表示
't' 2進数で表示。't' は "two" からくる。
'a' アドレス
'c' 文字(ASCII)として表示
'f' 浮動小数点
's' 文字列として表示

一方でxコマンドの説明は下記である。

ここでx/iは機械命令として表示するということです。

一般的にはxコマンドは x/NFU ADDRという形式です。ここでADDRは表示したいアドレスです。
Nは何回くりかえすか、Fは先に示した表示のフォーマット('x', 'd', 'u',
'o', 't', 'a', 'c', 'f', 's', 'i')、Uは下記の単位です。

表には'i'がないのは上述したとおりである。本文でx/iというのは何か明示しているので、誤解は生じないと思うがいかがだろうか。

もっとよい表現方法というのは確かにあると思うので、ご教示いただければ幸いである。コメントに感謝します。

いずれにせよ、一つの本をきっかけにデバッグについていろいろな議論が起こることは著者の一人として望外の喜びである。重ねて感謝したい。