1

このシステムでカーネルのデバッグを開始しようとしています: 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 制御下で実行されていますが、ソース コード レベルでデバッグすることはできません。

私は次のようにします:

  1. ボードの電源を入れ、uboot シェルに入ります。
  2. openOCD セッションを開始する
  3. theKernel 呼び出しで bootm.c に Uboot ブレークポイントを設定します。

    cleanup_before_linux ();
    theKernel (0, machid, bd->bi_boot_params);
    
  4. Eclipse デバッグ セッションを開始します。

    • 監視停止
    • オフセットなしで uboot-a をロードする

      load u-boot-2010.06/u-boot 
      Loading section .text, size 0x349ec lma 0x26f00000
      
    • uboot を起動して実行します

    • 「theKernel」呼び出しで uboot が停止する

カーネルがアドレス 0x20008000 にあることはわかっています。

  1. openOCD セッションを再起動します
  2. カーネル構成で 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 個の関数シンボルがあることは、私にとって驚くべきことです。

ここに画像の説明を入力

4

0 に答える 0