JTAG + GDBを使用してLinuxカーネルをデバッグする方法は?

JTAG + GDBを使用してLinuxカーネルをデバッグする方法は?

私のボードへのJTAG接続とシリアルポート接続が正常に設定されました。私は以下の図に従いました(少し違いがあります)。

私のものGDB_クライアント私のLinuxホストにはありますが、OCDを開く私はWindowsホストにあり、次の方法で互いに通信します。GDBサーバーインターネット経由。それらは互いに簡単に通信でき、次の方法でマイボードにアプリケーションをロードできます。広東開発銀行私のLinuxでJTAGを介して。

1

これは私のものです。プラットフォーム仕様:

SOC: STM32H743 (Cortex m7 single core -> ARMv7E-M)
Internal Flash: 2MB (only u-boot is in the flash memory)
Board: Waveshare CoreH7XXI dev board
On-board DRAM: 8MB
SDCARD: 1GB (the ROOTFS and Linux kernel are in the SD card)
Bootloader: mainline U-boot
kernel:     mainline Linux kernel

Debug Probe: STLink V2

~によるとこのガイド: カーネルをメモリにロードするgdbを使用してカーネルをデバッグすることに慣れている場合は、gdbを使用してターゲットに直接カーネルをロードできます。最も実用的な方法は、カーネルの起動時にハードウェアブレークポイントを設定し、JTAGリセット信号を使用してボードをリセットすることです。ブートローダはボードを初期化し、カーネルが起動すると実行を停止します。その後、カーネルをメモリにロードして実行できます。

カーネルの先頭にくちばしポイントを配置し、ところが問題はブレークポイントで止まらないということだ。ロードしよう仮想マシンLinux私の記憶にファイルを保存してください。

これが私がすることです:

(gdb) file vmlinux
(gdb) target remote 192.168.1.53:8888
(gdb) break __init_begin
(gdb) cont
(gdb) mon reset #perhaps this needs to be done from the openocd telnet session..
Breakpoint 1, 0xc0008000 in stext ()
(gdb) load vmlinux

私もこれを試しましたが、再びブレークポイントで停止しません。

(gdb) break *0xD0008000
Breakpoint 9 at 0xd0008000: file arch/arm/kernel/head-nommu.S, line 61.

修正する:

時には動作しますが、時には動作しません。ボードをリセットしたら、gdbを使用してプログラムをすばやく一時停止し、再起動して動作させる必要があるようです。なぜこれが起こるのですか?

ベストアンサー1

"kaslr"オプションを無効にしてみましたか?また、ブレークポイントを設定しようとしましたが、ブレークポイントが到達できませんでした。 bootargsに "nokaslr"を渡して無効にしようとしましたが、動作しません。ターゲットボード(Xilinx Zynq Ultrascale +)でまだ「Full Randomize」オプションが選択されているため、これは適用されないとします。

cat /proc/sys/kernel/randomize_va_space私はターゲットボードに使用します。

これが正しいアプローチであるかどうかはわかりませんが、アドレスの不一致によってブレークポイントがヒットしないことが直感的にわかります。

おすすめ記事