従来の adb(1) ユーティリティーから mdb(1) への移行は比較的簡単です。MDB は adb の構文、組み込みコマンド、およびコマンド行オプションに進化的な互換性を提供します。MDB は adb(1) の既存の機能すべてに互換性を提供しようとしますが、バグレベルで adb(1) との互換性はありません。この付録では、mdb(1) で正確にはエミュレートされない adb(1) の機能について簡単に説明し、ユーザーに新しい機能を紹介します。
MDB は adb(1) が認識するコマンド行オプションのスーパーセットを提供します。adb(1) のオプションはすべてサポートされ、以前と同じ意味を持ちます。/usr/bin/adb パス名は mdb(1) を呼び出すリンクとして提供されるので、自動的に拡張 adb(1) 互換モードが有効になります。/usr/bin/adb リンクを実行することは、-o adb オプション付きで mdb を実行すること、あるいは、デバッガを起動したあとに ::set -o adb を実行することと同じです。
MDB 言語は adb(1) 言語と同じ構文を厳守することによって、従来のマクロやスクリプトファイルにも互換性を提供します。新しい MDB の dcmd は、拡張形式の ::name を使用することによって、: または $ の接頭辞付きの従来のコマンドと区別されます。dcmd 名の右側にある式も、ドル記号の接頭辞付きの各括弧 ($[ ]) で式を囲めば評価できます。adb(1) と同様に、感嘆符 (!) で始まる入力行は、コマンド行がユーザーのシェルで実行されることを示します。MDB では、デバッガコマンドの接尾辞として感嘆符を付けると、その出力が感嘆符の後ろにあるシェルコマンドにパイプで渡されることを示します。
adbでは、2 項演算子は左結合で、単項演算子よりも優先順位は低くなります。入力行の 2 項演算子は厳密な左から右の順番で評価されます。MDB では、2 項演算子は左結合で、単項演算子よりも優先順位は低くなりますが、2 項演算子は 「2 項演算子」の表の優先順位に従って動作します。演算子は ANSI C の優先順位に準拠します。あいまいな式を明示的に括弧で囲んでいない従来の adb(1) マクロファイルを MDB で使用するには、そのファイルを更新する必要がある可能性があります。たとえば、adb では、次のコマンドは整数値 9 に評価されます。
$ echo "4-1*3=X" | adb 9 |
MDB では、ANSI C と同様に、演算子「*」は「-」よりも優先順位が高いので、結果は整数値 1 になります。
$ echo "4-1*3=X" | mdb 1 |
MDB が認識するウォッチポイント長さ指示子の構文は、adb(1) で記述されている構文とは異なります。特に、adb のウォッチポイント用コマンド :w、:a、および :p では、整数の長さ (バイト数) をコロンとコマンド文字の間に挿入していました。MDB では、このカウントは初期アドレスの後ろに繰り返しカウントとして指定する必要があります。簡単に言うと、adb(1) コマンドでは次のようになります。
123:456w 123:456a 123:456p |
MDB では次のようになります。
123,456:w 123,456:a 123,456:p |
ユーザープロセスのウォッチポイントを作成する場合、MDB の ::wp dcmd の方がより完全な機能を提供します。同様に、従来の kadb 長さ修飾子コマンド $l はサポートされません。このため、kmdb で使用される各 ::wp コマンドにはウォッチポイントサイズを指定する必要があります。
仮想アドレスマップとオブジェクトファイルマップのセグメントを変更するための adb(1) コマンド (に相当するコマンド) は MDB にはありません。特に、/m、/*m、?m、および ?*m 書式指定子は、MDB では認識またはサポートされません。このような指定子は、現在のオブジェクトやコアファイルの有効なアドレス可能な範囲を手動で変更するときに使用されていました。MDB はこのようなファイルのアドレス可能な範囲を適切かつ自動的に認識し、その範囲をライブプロセスをデバッグしているときに更新するので、上記コマンドは必要ありません。
MDB では、いくつかのコマンドからのテキスト出力形式が厳密には異なります。マクロファイルは同じ基本規則を使用して書式化されますが、あるコマンドの文字単位の出力に厳密に依存するシェルスクリプトは変更する必要がある可能性があります。adb コマンドの出力を構文解析するシェルスクリプトは、その妥当性を検査し直して、MDB の移行の一部として更新する必要があります。
従来の kadb ユーティリティーでは、既存の adb 構文と互換性のない遅延ブレークポイントの構文がサポートされていました。kadb では、これらの遅延ブレークポイントは構文 module#symbol :b を使って指定しました。kmdb で遅延ブレークポイントを設定するには、第 6 章「実行制御」で説明しているように、MDB の ::bp dcmd を使用します。
従来の kadb ユーティリティーでは、:i および :o コマンドを使って x86 システム上の入出力ポートにアクセスできました。mdb または kmdb では、これらのコマンドはサポートされていません。x86 システム上の入出力ポートにアクセスするには、::in および ::out コマンドを使用します。