0

gdbを実行しているリモートマシンを使用して、Macでカーネルをクラッシュさせているデバイスドライバーをデバッグしようとしています(ここの手順に従ってください)。両方のマシンはイーサネットによって同じネットワークに接続されています(同じルーターでも、両方がネットワークにアクセスできます)。nvram boot-args="debug=0x144"また、ターゲットを設定して再起動しました。

次に、通常どおり、カーネル拡張機能をターゲットにロードします。ホストマシンで、次のようにgdbを起動します。

$ gdb -arch i386 /Volumes/KernelDebugKit/mach_kernel

gdbに入ったら、カーネルマクロをロードし、リモート接続用にセットアップします

(gdb) source /Volumes/KernelDebugKit/kgmacros
(gdb) target remote-kdp
(gdb) kdp-reattach 11.22.33.44

ただし、最後のコマンドは接続を確立せず、次の無限のスプールを取得します

kdp_reply_wait: error from kdp_receive: receive timeout exceeded
kdp_transaction (remote_connect): transaction timed out
kdp_transaction (remote_connect): re-sending transaction

gdbをターゲットマシンに接続する正しい方法は何ですか?

4

2 に答える 2

1

答えは、ホストからgdbを接続しようとする前に、ターゲットにカーネルパニックがあることを確認することです。

于 2012-09-05T15:55:22.450 に答える
1

ターゲットに侵入するには、次のようないくつかの方法があります。

  • 上記の回答で述べたように、カーネルパニック。
  • cmd-option-ctrl-shift-escキーの組み合わせによってトリガーされるマスク不可割り込み。
  • pexpert / pexpert.hで宣言されているPE_enter_debugger()を使用して、カーネル拡張のブレークをコーディングします。
  • NVRAM boot-args値にDB_HALT(0x01)を設定して、起動時に停止します。

さらに、ターゲットがデバッガーで停止している間はARP要求に応答できないため、永続的なARPテーブルエントリを設定する必要がある場合があります。デバッガー起動シェルスクリプトで次を使用して、ARPエントリがまだ存在しない場合は設定します。

if !(arp -a -n -i en0 | grep '10\.211\.55\.10[)] at 0:1c:42:d7:29:47 on en0 permanent' > /dev/null) ; then
    echo "Adding arp entry"
    sudo arp -s 10.211.55.10 00:1c:42:d7:29:47
fi

もっと専門家が私のシェルスクリプトを改善できるかもしれません。

上記のすべては、 http://developer.apple.com/library/mac/documentation/Darwin/Conceptual/KernelProgramming/KernelProgramming.pdfに記載されています。

于 2012-09-05T17:09:02.770 に答える