2

私は gdb を使用して、自作の gdb サーバーを介して LEON2 ベースの ASIC と通信しています (ここでは「gdb サーバー」が正しい言い回しであるかどうかはわかりません)。これは次のように機能します: gdb クライアントは通常の gdb プロトコルを使用して gdb サーバーと通信し、gdb サーバーは gdb 要求を HW からの読み取りと書き込みに変換し、結果があればクライアントに送り返します。私の gdb クライアントは、Windows 7 PC 上の RTEMS 4.8.0 の sparc-rtems-gdb 6.6 です。

gdb クライアントを起動したら、次のコマンドを実行して gdb サーバーに接続します。

target extended-remote localhost:5000

次に、RAM 内の単語を変更したいので、次の gdb コマンドを実行します。

set *((unsigned int*) 0x40000000)=2

gdb サーバーをデバッグしているときに、次の行を受信して​​いることがわかります。これは、gdb プロトコルに従って予期された正しいものです。つまり、4 バイト、値 2 をアドレス 0x40000000 に書き込みます。

M40000000,4:00000002

ここで混乱: 上記の書き込み要求の後、別の要求が gdb クライアントから送信され、アドレス 0xABD37787 から 4 バイトを読み取ります。

mabd37787,4

gdb クライアントがそのアドレスから読み取ろうとするのはなぜですか? 私の知る限り、この読み取りを要求するために何もしていません。書き込みを実行したかっただけです。たとえば、書き込みを検証するために、gdb がアドレス 0x40000000 を読み戻せば問題ありません。しかし、どこにもないアドレス 0xABD37787 がハードウェアに存在しないため、問題が発生します。

gdb クライアントをデバッグして、送受信しているもの (およびその理由) を正確に判断する方法はありますか? または、この動作を説明できる gdb の設定はありますか?

よろしくお願いします

ヘンリク

4

1 に答える 1

3

gdb サーバーのデバッグ中に、次の行を受信することがわかります

gdbserver をデバッグする必要はありません。GDB でオンにするだけでset debug remote 1、送受信されたすべてのパケットを GDB に出力させることができます。

gdb クライアントがそのアドレスから読み取ろうとするのはなぜですか?

いくつかの可能性があります:

  • GDB は、プログラム カウンターが現在0xABD37787
  • GDB は、そこにブレークポイントを設定する必要があると考えています
  • GDB は、読み取る必要のあるデータがあると考えています

GDB がその場所を読み取ろうとしている理由を突き止める方法の 1 つは、set debug infrun 1. これにより、GDB 自体が何をしようとしているのかについて多くの情報が出力されます。

もう 1 つの方法は、GDB 自体をデバッグすることです。にブレークポイントを設定しputpkt、対象のパケットが送信されているときにスタック トレースを調べて、送信されている理由を確認します。

于 2015-01-14T05:13:45.137 に答える