web-dev-qa-db-ja.com

リモートの「g」パケット応答が長すぎます

Kvmvmを使用してLinuxカーネルをデバッグしようとしています。 「リモート 'g'パケット応答が長すぎます」というエラーメッセージが表示されます。私のホストは64ビットであり、VMも64ビットです。

私のステップ:

  1. VMをカスタム-kernel、-initrd、および-appendオプションで開始します。
  2. Gdbを起動します
  3. 「setarchitecturei386:x86-64:intel」を実行します
  4. 「add-symbol-filelinux-3.0/vmlinux」を実行します
  5. 「showArch」を実行して、まだ「i386:x86-64:intel」であることを確認します
  6. 「targetremotelocalhost:1234」を実行します
  7. 「続行」を実行します
  8. Ctrl + Cを押すと、上記のメッセージが表示されます。

誰かがこの問題に直面しましたか?

19

gdbは、実行時に命令セットを切り替えるCPUに対してはうまく機能しません。カーネルがアーリーブートを終了するのを待ってから接続し、qemuの-Sフラグを使用しないでください。

12
Gabriel

私も同じ問題に直面しました。gdbstub.c(qemuソース内)を変更して常に64ビットレジスタを送信し、set Arch i386:x86-64を渡すことでアーキテクチャが64ビットであることをGDBに示唆することで修正しました。

ここでパッチを確認できます:[URLは利用できなくなりました]にアクセスしてください

8
Samir Das

ブートプロセスの非常に早い段階でgdbを接続する同様の問題(およびこの質問)を見つけました。他の回答で述べたように、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
...
6
Seth P

Gdbの引数として誤ってバイナリ名を省略してしまいました。だからこれは私のために働いた。

$ gdb ./vmlinux
(gdb) target remote localhost:1234

そして、出力を取得しました:

Remote debugging using localhost:1234
0xffffffff81025f96 in default_idle ()

デバッガーにはvmlinuxが必要なので、必ず提供してください。 OPには別の問題がありますが、私の答えは、gdbに引数を指定するのを忘れて、OPと同じエラーメッセージが表示されることになった人に役立つかもしれません。

2
SloppyJoe