3

ホストとターゲット間のシリアルおよび USB 接続に問題があります。以下は私のセットアップです。ホストとターゲットの両方にシリアル (DB9) ポートはありません。

ホスト : 実行中の Windows + VMshare + Ubuntu

ターゲット: Linux カーネル 3.19 を実行しています。シリアルポートとして機能するMINI USBポートがあり、それだと思います(CP210x uart to usb)

接続 1 : ホスト (USB から DB9 オス - PL2303) + DB9 メスからメス + (DB9 オスから USB) ターゲット。

接続 2 : ホスト (USB) --ケーブル-- (USB ミニ) ターゲット

ホスト ( ubuntu VM ) は、USB デバイス (両方の接続タイプ) を /dev/ttyUSB0 として認識できます。VM がデバイス制御を引き継ぐため、デバイスは Windows デバイス マネージャに表示されません。

ターゲットが UEFI シェルで起動します。syslinux.cfg ファイルを変更して、「kgdbwait kgdboc =ttyS0, 115200」を APPEND フラグに追加します。変更を保存して ( F2 を押す)、終了します ( F3 を押します)。イメージを起動します。ターゲットは、次のメッセージとともに kdb プロンプトに入ります

kgdb: Waiting for connection from remote gdb...
Entering kdb ( current= <64bit address>, pid 1) on processor 0 due to Keyboard Entry
Kgdb > _

ホスト側で、次のコマンドを実行すると、以下がエラーになります

root@ubuntu: cd /images
root@ubuntu: sudo gdb ./vmlinux
Reading symbols from ./vmlinux done.
(gdb)
(gdb) target remote /dev/ttyUSB0
Remote debugging using /dev/ttyUSB0
Ignoring packet error, continuing...
warning: unrecognized item "timeout" in "qSupported" response
Ignoring packet error, continuing...
Ignoring packet error, continuing...
Bogus trace status reply from target: timeout

私が試した実験

  1. ホストで「 target remote /dev/ ttyS0」を使用しましたが、同じ問題が発生しました
  2. 上記の各接続 ( 1 および 2 ) で異なるケーブルを試しました
  3. ターゲットで UEFI シェルの syslinux.cfg ファイルの編集を削除し、イメージを起動して、「echo g > /proc/sysrq-trigger」を使用して kgdb に入りました。
  4. KGDB* 、KGDB_SERIAL*、KGDB_USB* に関連するすべてのカーネル構成が有効になっています
  5. 利用可能なすべてのボーレート

質問

  1. 「kgdbwait kgdboc= ttyS0 , 115200」の代わりに「kgdbwait kgdboc= ttyUSB0 , 115200」を使用すると、ターゲットは停止しません。ターゲットが完全に起動してログイン プロンプトが表示されると、接続 1 を使用すると、デバイスが ttyUSB0 として認識されることがわかります。または USB デバッグの場合、直接 USB--USB ワイヤ (接続 3) を使用する必要がありますか?
  2. syslinux.cfg は USB デバッグをサポートしていますか? 値「0、115200」を持つSERIALフラグがあるため、0はttyS0を指します。syslinux のドキュメントには、USB タイプ デバイスの値がありません。
  3. 接続 2 を使用すると、タイムアウトやパケット エラーの問題が発生するのはなぜですか
  4. ときどき接続 2 で、ホスト上で「 target remote /dev/ttyUSB0 」を実行すると、ターゲット上にジャンク文字があることに気付きます。そのため、何らかの通信が行われているため、さまざまなボーレートを試しても同じ問題が発生しました。これは、セットアップに本質的な問題があることを示していますか?
  5. 多くのオンライン フォーラム/ドキュメントでは、カーネルが kdb プロンプトに入ったときに「キーボード入力による kdb の入力」が表示されません。これは異常ですか?
4

1 に答える 1

8

リモート kgdb デバッグのセットアップは少し面倒です。kgdb が機能するには、いくつかの前提条件/制限があります。私はそれを分解しようとします。

このセットアップでは、2 台のマシンを準備する必要があります。
HOST:エージェント プロキシと GDB がインストールされている場所。
TARGET:デバッグ中の Linux システム。

接続設定

[Host /dev/ttyUSB0] USB to Serial --------- COM port [Target /dev/ttyS0]

TARGET 側では、kgdb で USB インターフェイスを使用することはできません。これは、すべての USB シリアル ドライバー ( CP210x、PL2303、...など) がポーリング フックを実装していないためです。COM ポートをシリアル ケーブルで直接接続する必要があります。HOST 側の USB インターフェイスを使用しても問題ありません。シリアル接続なので、USB-to-Serial コンバーターを使用し、HOST に適切なドライバーをインストールする必要があります。

両側で適切なボーレートを設定します。

[Target] stty -F /dev/ttyS0 115200
[Host] stty -F /dev/ttyUSB0 115200

シリアル接続が双方向で機能することを確認します。以下を使用できます。

[Host] cat /dev/ttyUSB0
[Target] echo 'from TARGET to HOST' > /dev/ttyS0

[Target] cat /dev/ttyS0
[Host] echo 'from HOST to TARGET' > /dev/ttyUSB0

マシンの両側にメッセージが表示されます。そうでない場合は、ケーブルまたはドライバーに問題がある可能性があります。

カーネルをコンパイル

KGDB* , KGDB_SERIAL*, KGDB_USB*, DEBUG_INFO, DEBUG_INFO_DWARF4, MAGIC_SYSRQカーネル構成で有効にします。コンパイルして TARGET にインストールします。

ここでの主な目的は、KGDB 機能を有効にして、vmlinux でデバッグ情報を保持することです。

エージェントとプロキシのセットアップ

agent-proxy は、TARGET のシリアル ポートのプロキシとして機能します。多重化のためにシリアルポートを分割します。1 つはプライマリ コンソール I/O 用で、もう 1 つは GDB セッション用です。したがって、両方を同時に処理できます。HOST マシンでエージェント プロキシを実行する必要があります。

git clone http://git.kernel.org/pub/scm/utils/kernel/kgdb/agent-proxy.git
cd agent-proxy ; make
./agent-proxy 5550^5551 0 /dev/ttyUSB0,115200

これはリダイレクトします:

  • TARGET のコンソールから HOST:5550 へ
  • HOST:5551 への TARGET の kgdb リスニング ポート

デバッグを開始

まず、プライマリ コンソールを開きます。

[Host] telnet localhost 5550

次のいずれかの方法で kdb モードに入ります。

[Target] echo ttyS0,115200 > /sys/module/kgdboc/parameters/kgdboc
[Target] dmesg | tail
(you should see KGDB: Registered I/O driver kgdboc, otherwise it failed)

[Target] echo g >/proc/sysrq-trigger

または、TARGET のブートローダーに次のカーネル パラメーターを追加します (初期のカーネル デバッグ用)。

console=tty0 console=ttyS0,115200 kgdbwait kgdboc=ttyS0,115200

TARGET マシンは、kdb に侵入するとすぐに停止します。
同時に、プライマリ コンソールに kdb プロンプトが表示されます。

....
Entering kdb (current=0xcb846c80, pid 2301) on processor 3 due to Keyboard Entry
[3]kdb>

入力kgdbしてから入力してください。TARGET は現在、リモート GDB の接続を保留中です。HOSTから接続します。

Host> gdb vmlinux
(gdb) target remote localhost:5551
Remote debugging using localhost:5551
kgdb_breakpoint () at kernel/debug/debug_core.c:1072
1072             wmb(); /* Sync point after breakpoint */
(gdb)

カーネルのデバッグを楽しんでください!

于 2016-04-26T10:14:13.593 に答える