8


シリアル ttyS0 を介して 64 ビット Suse マシンから MIPS Linux ドライバーをデバッグしたいと考えています。使用されている gdb は、LAN 経由でアプリケーションのデバッグを行うとうまく機能しますが、シリアル経由の kgdb では機能しません。このページとその他のページを使用してデバッグを開始しましたが、最終結果はありませんでした。

私のカーネルは次の設定でコンパイルされています。

CONFIG_MAGIC_SYSRQ=y
CONFIG_HAVE_ARCH_KGDB=y
CONFIG_KGDB=y
CONFIG_KGDB_SERIAL_CONSOLE=y
# CONFIG_KGDB_TESTS is not set
CONFIG_CMDLINE="kgdboc=ttyS0,115200"

gdb を実行すると:

gdb vmlinux
(gdb) set remotebaud 115200
(gdb) set debug remote 1
(gdb) target remote /dev/ttyS0

次の出力を確認できます。

出力 (GDB_TERMINAL):

(gdb) target remote /dev/ttyS0
Remote debugging using /dev/ttyS0
Sending packet: $qSupported:qRelocInsn+#9a...Ack
Timeout in mid-packet, retrying
Timed out.
Timed out.
Ignoring packet error, continuing...
Packet qSupported (supported-packets) is supported
warning: unrecognized item "qSupported:qRelocIns" in "qSupported" response
Sending packet: $Hg0#df...Nak
Sending packet: $Hg0#df...Ack
Packet received: Hg0
Sending packet: $?#3f...Packet instead of Ack, ignoring it
Ack
Timed out.
Timed out.
Timed out.
Ignoring packet error, continuing...
Sending packet: $Hc-1#09...Nak
Sending packet: $Hc-1#09...Ack
Reply contains invalid hex digit 36

出力 (REMOTE_TARGET):

+$?#3f09n+#9a$Hg0#df+09

もう何も起こりません!!!

sysrq もテストしますが、前述の sysrq-option 'g' が適合しないようです!

echo b > /proc/sysrq-trigger 
#successfully reboot

echo g > /proc/sysrq-trigger 
#prints only the help message (SysRq : HELP : loglevel(0-9) reBoot Crash termin .....)

sysrq は正しく実行されていますか?
私が見逃したものはありますか?
リモートデバイスで実行中の kgdb をテストする方法はありますか?

4

2 に答える 2

2

シリアル リンクを介して kgdb で gdb を実行するには、多くの問題がありました。私のホストは Intel x86 Linux マシンで、ターゲットは ARM 32 ビット Raspberry Pi 2 です。ターゲットはUSB to TTL Serial Cableで接続されています。主な問題とその解決策を次に示します。

1)またはgdbと同時に使用しないでください。screenminicom

minicomtty に接続すると、GDB がハングしてからクラッシュします。

(gdb) target remote /dev/ttyUSB0
Ignoring packet error, continuing...
Ignoring packet error, continuing...
Ignoring packet error, continuing...
Ignoring packet error, continuing...
/build/gdb-cXfXJ3/gdb-7.11.1/gdb/thread.c:89: internal-error: inferior_thread: Assertion `tp' failed.
A problem internal to GDB has been detected, further debugging may prove unreliable.```

接続するとscreen、GDB は接続に失敗します。

(gdb) tar rem /dev/ttyUSB0
/dev/ttyUSB0: Device or resource busy.

2) パケットの破損とタイムアウト

無効なパケット、不正なチェックサム、古いパケットの途中で新しいパケットが開始された、タイムアウト

ターゲット アーキテクチャをサポートする GDB を使用します。x86 (少なくとも Ubuntu) のデフォルトの GDB は、アーム ターゲットをサポートしていません。代わりにgdb-multiarch、またはクロスコンパイル ツールセットに対応する GDBを使用しarm-linux-gnueabihf-gdbます。コマンドで利用可能なアーキテクチャを一覧表示します(gdb) set architecture。私のauto場合、アーキテクチャは腕のターゲットを正しく検出していました。

3) 接続する前に、ターゲットで KGDB をトリガーする必要があります。

リモートが「vMustReplyEmpty」に予期せず応答しました: vMustReplyEmpty

オフセット クエリへの不正な応答、qOffsets

GDB は接続を試みますが、ターゲットはデバッグ モードではありません。GDB に接続する前に、debug sysrq をトリガーする必要があります。キーボード ショートカットが機能しませんでした。echo g > /proc/sysrq-triggerroot として SSH 経由でコマンドを実行すると機能します。

4) ボーレートを設定する

警告: ボーレート 115200 が無効です。最大値は 38400 です。 /dev/ttyUSB0: 引数が無効です。

設定されたボーレートは、kgdbocカーネル パラメータと GDB の間で一致する必要があります。私の場合、ボーレート 115200 はサポートされていませんでした。提案どおりにボーレートを 38400 に設定する必要がありました。kernel cmdline:kgdboc=ttyAMA0,38400を使用してターゲットを再起動してから、次のようにします。

(gdb) set remotebaud 38400
(gdb) target remote /dev/ttyUSB0
Remote debugging using /dev/ttyUSB0
0x800b4730 in kgdb_breakpoint ()

これらの問題が解決されると、カーネルのデバッグは期待どおりに機能しました。

于 2016-09-14T19:30:59.380 に答える