私のボードへのJTAG接続とシリアルポート接続が正常に設定されました。私は以下の図に従いました(少し違いがあります)。
私のものGDB_クライアント私のLinuxホストにはありますが、OCDを開く私はWindowsホストにあり、次の方法で互いに通信します。GDBサーバーインターネット経由。それらは互いに簡単に通信でき、次の方法でマイボードにアプリケーションをロードできます。広東開発銀行私のLinuxでJTAGを介して。
これは私のものです。プラットフォーム仕様:
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
私はターゲットボードに使用します。
これが正しいアプローチであるかどうかはわかりませんが、アドレスの不一致によってブレークポイントがヒットしないことが直感的にわかります。