ブート プロセスの非常に早い段階で gdb を接続する同様の問題 (およびこの質問) を見つけました。この問題は、次を使用して確認できますset debug remote 1
。
(gdb) set debug remote 1
(gdb) target remote localhost:1234
Remote debugging using localhost:1234
...
Sending packet: $g#67...Ack
Packet received: 000000000000000... <~600 bytes>
(gdb) until *0x1000 # at this address we'll be in a different cpu mode
...
Sending packet: $g#67...Ack
Packet received: 10000080000000000000000000000000800000c... <~1000 bytes>
...
Remote 'g' packet reply is too long: 1000008000000000000000000...
(gdb)
gdb バグ トラッカー (および他の場所) でこの問題で見つかったように、大きすぎるパケットが検出された場合に内部バッファーのサイズを変更するように gdb にパッチを適用すると
、実際に問題を回避できます。また、QEMU にパッチを適用して 64 ビット サイズのパケットのみを送信するようにします。 . ただし、後者の解決策は非 64 ビットモードでのデバッグを中断し、前者の修正は不完全である可能性があるようです:
GDB が既にデバッグしているときに、GDB の背後でターゲットを変更するのはかなり間違っているように思えます。g/G パケットのサイズが誤って変更されるだけでなく、レイアウトも変更される可能性があります。再構成でターゲットの説明が変更された場合、GDB がターゲットの説明全体を取得/再計算する必要があるように思えます。今日、それは切断/再接続でしかできないと思います。
– https://sourceware.org/ml/gdb/2014-02/msg00005.html
投稿の最後に記載されている切断/再接続の回避策は機能しているようです。
(gdb) disconnect
Ending remote debugging.
(gdb) set architecture i386:x86-64
The target architecture is assumed to be i386:x86-64
(gdb) target remote localhost:1234
Remote debugging using localhost:1234
(gdb) info registers
rax 0x80000010 2147483664
rbx 0x0 0
...