このシステムでカーネルのデバッグを開始しようとしています: Amontec JTAGkey2、openocd、gdb、eclipse。
最後に、実行中のカーネルとアプリケーションをデバッグしたいと思います。問題はほとんどなく、順次解決する必要があるようです。現在、CPU の一時停止/再開、RAM の読み取り/書き込みがあります。不足しているもの: ステップ イン、ステップ オーバー、C/C++ レベルのデバッグ。
私は次のことを行います: - JTAG を接続し、ボードの電源を入れ、Uboot を介してデバッグ メッセージで uImage を起動します - openocd を起動します:
# openocd -f /usr/share/openocd/scripts/interface/jtagkey2.cfg -f /usr/share/openocd/scripts/board/at91sam9g20-ek.cfg
出力:
jtag_nsrst_delay: 200
jtag_ntrst_delay: 200
RCLK - adaptive
TapName | Enabled | IdCode Expected IrLen IrCap IrMask Instr
---|--------------------|---------|------------|------------|------|------|------|---------
0 | at91sam9g20.cpu | Y | 0x00000000 | 0x0792603f | 0x04 | 0x01 | 0x0f | 0x0f
Info : max TCK change to: 30000 kHz
Info : RCLK (adaptive clock speed)
Info : JTAG tap: at91sam9g20.cpu tap/device found: 0x0792603f (mfg: 0x01f, part: 0x7926, ver: 0x0)
Info : Embedded ICE version 6
そして問題はここから始まります:
openocd:
Warn : acknowledgment received, but no packet pending
undefined debug reason 6 - target needs reset
Warn : target not halted
日食:
symbol-file /opt/Tixi_Repos/KiwiG6v2/buildroot-2011.05/package_tixi/linux-2.6.39/arch/arm/boot/compressed/vmlinux
target remote localhost:3333
start () at arch/arm/boot/compressed/head.S:108
108 kphex r5, 8 /* end of kernel */
JTAG がコードを 0x0 にロードしようとしているようにも見えますが、これは間違っていると思います:
更新 1 :
ARM のいくつかのオンライン チュートリアルを分析した後:
Eclipse のリセットおよび停止コマンドは完全には機能しません。それらのチェックを外して、コマンド ウィンドウに書き込むことをお勧めします。また、ロードアドレスを追加することもできます:
monitor halt
load arch/arm/boot/compressed/vmlinux 0x22000000
使わない
monitor reset
Uboot を起動して、RAM やその他の周辺機器を初期化します。次に、シェルに入って Uboot を停止します。次に、Eclipse に Linux を RAM に書き込んで起動させます。非常に時間がかかりますが、少しはうまくいきます。カーネルは、コンソールを返さずに RPC 初期化で開始および停止します。
- Uboot コンソール内でカーネルを RAM にロードし、その後 JTAG セッションを開始することはできますか?
- [load ...] コマンドと [monitor load...] コマンドの違いは何ですか
- uImage の代わりに /compressed/vmlinux をロードする必要があるのはなぜですか?
- Eclipseウィンドウには、2つのロードフィールドがあります。イメージをロードし、シンボルをロードします。両方のオプションを無効にしますが、load arch/arm/boot/compressed/vmlinux 0x22000000 のみを書き込みます。それはおそらく次の問題の理由ですか?
更新 2 : わかりました。ヒントをありがとう。
私はいくつかの進歩を遂げました。何かアドバイスをいただけないでしょうか。おそらく私はまだ何か間違ったことをしているのかもしれません。
現在、カーネルは JTAG 制御下で実行されていますが、ソース コード レベルでデバッグすることはできません。
私は次のようにします:
- ボードの電源を入れ、uboot シェルに入ります。
- openOCD セッションを開始する
theKernel 呼び出しで bootm.c に Uboot ブレークポイントを設定します。
cleanup_before_linux (); theKernel (0, machid, bd->bi_boot_params);
Eclipse デバッグ セッションを開始します。
- 監視停止
オフセットなしで uboot-a をロードする
load u-boot-2010.06/u-boot Loading section .text, size 0x349ec lma 0x26f00000
uboot を起動して実行します
- 「theKernel」呼び出しで uboot が停止する
カーネルがアドレス 0x20008000 にあることはわかっています。
- openOCD セッションを再起動します
カーネル構成で ecipse デバッガーをもう一度起動します。
- 監視停止
アドレス 0x20008000 にカーネルをロードします
load arch/arm/boot/compressed/vmlinux 0x20008000 Loading section .text, size 0x8bdc7c lma 0x20008000
- デバッグセッションを開始
すべてが正常に動作し、カーネルが起動しますが、ソース コード レベルでデバッグすることはまだできません。
「symbol is not available」
カーネルの DEBUG と DEBUG_INFO がオンになっています。
vmlinux スクリーンショット
このファイルに約 50 個の関数シンボルがあることは、私にとって驚くべきことです。