私は 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 の設定はありますか?
よろしくお願いします
ヘンリク