ARM用JTAG-ICE GDB

ARM用JTAG-ICE GDBとの接続

概要

 MITOUJTAGに内蔵されたARM用JTAG-ICE(エミュレータ)は、GDBからの接続を受けることができます。この機能はGDBスタブと呼ばれます。

 GDBスタブ機能を使うと、ネットワークを介して、GDBやInsightなど、他のデバッガのフロントエンドを活用することができます。また、遠隔地に置かれた機器のリモートデバッグも容易に可能になります。

 GDBとの接続にはデフォルトではTCP/IPの2159番ポートを使用するようになっていますが、設定の変更も可能です。


図1 GDBスタブ の接続方式

?

GDBスタブの起動方法

MITOUJTAGを起動し、内蔵のARM用JTAG-ICEを起動したら、ツールボタンの一番右にある「GDB」と書かれたボタンを押します。

図2 GDBスタブの起動

?

 図3のように待ち受けポート番号を入力するダイアログが開きますので、ポート番号を入力し、OKボタンを押します。このポート番号はデフォルトでは2159番になっています。

図3 待ち受けポート番号の入力

※ Norton Internet Securityなどのファイアーウォールソフトウェアをご使用の場合は、TCP/IPの待ち受けのために警告が表示されることがありますが、「許可する」を選択してください。

GDBとの接続方法

 ARM用のGDBは、arm-elf-gdb のような名前で配布されています。ここでは、arm-elf-gdbを使用するものとします。MITOUJTAGとarm-elf-gdbを動作させるマシンは、同一のマシンでも別のマシン構いません。

 LinuxやCygwinなどからarm-elf-gdbを起動後、リモートで接続するためには次のように入力します。

?

(gdb)?target remote?ホスト名:ポート番号

?

 ホスト名は、MITOUJTAGを動作させているPCのIPアドレスを、ポート番号はMITOUJTAGで設定したGDBスタブの待ち受けポート番号(デフォルトで2159)を入力します。MITOUJTAGを実行させているマシン上でGDBを実行させる場合は、ホスト名にはlocalhostと入力します。

 接続が成功すると、ターゲットCPUが停止し、GDBの画面には現在のプログラムカウンタの値が表示されます。

 次の図4は、TCP/IPで接続した後、メモリの0X400000番地から逆アセンブラとメモリダンプを行った例です。

図4 GDBスタブでの接続とメモリダンプ

 さて、実際の組み込みソフトウェア開発では、GCCでコンパイルしたプログラムをターゲットボード上にダウンロードし、デバッグするということがよく行われます。

 そこで、CQ出版のRISC評価キット ARM7を使用し、GDBスタブを動作させる例を紹介します。なお、次の例で紹介するソースコードは次のとおりです。

 次のリスト1は、上記のサンプルプログラムをGDBからプログラムをダウンロードし、ステップ実行や変数値の表示を行わせた際のログです。

user@linux:~/LED$?arm-elf-gdb -silent?<= GDBをsilentモードで起動
(gdb)?file main.elf ?<= ロードするファイル名を指定
Reading symbols from main.elf...done.
(gdb)?target remote 192.168.1.2:2159 <= リモート接続を行う
Remote debugging using 192.168.1.2:2159
0xfbc in ?? ()?<= プログラムカウンタが0xfbcで停止
(gdb)?load ?<= ファイルをダウンロードする
Loading section .start, size 0x64 lma 0x400000
Loading section .text, size 0x1e8 lma 0x421000
Loading section .rdata, size 0x17 lma 0x4211e8
Start address 0x421000 , load size 611
Transfer rate: 4888 bits in <1 sec, 55 bytes/write.
(gdb)?b 84?<= ソースコードの84行目にブレーク
ポイントを設定

Breakpoint 1 at 0x4211a8: file main.c, line 84.
(gdb)?cont?<= 実行
Continuing.
Program received signal 0, Signal 0.?<= ブレークポイントに達し、停止
_main () at main.c:84
84 k = k + (k >> 4);
(gdb)?print k  <= 変数kの値を表示
= 10000
(gdb)?next  <= 1行分のソースを実行
86 if(k > 50000) k = 1000;
(gdb)?print k  <= 変数kの値を表示
= 10625
(gdb)

リスト1 サンプルコードをGDBで実行させた例

 このように、GCCでコンパイルしたプログラムを、MITOUJTAGを通じてダウンロードし、GDBを用いてソースコードレベルでデバッグすることができます。

 なお、GDBのリモート接続を行っている関係上、次のリスト2のようなソースコードの部分でステップ実行させてはいけません。

for(i=0;i<100000;i++) ;

リスト2 ステップ実行させてはいけないソースコード

このような部分でステップ実行させると、GDBは10万回のステップ実行をスタブに送信し、処理が終わるまで制御が戻らないため、一見ハングアップしたような動作をします。

?

最後に、ARM用GDBでよく使われるコマンドをまとめます。

コマンド

内容

file ファイル名

ロードするファイルの指定

target ホスト名:ポート番号

リモート接続

load

オブジェクトファイルのロード

cont

ブレーク解除(再スタート)

CTRL+C

強制ブレーク

print 変数名

変数の値を表示

set 変数名=値

変数に値を設定

x/[長さ]b [アドレス]

バイト単位でのメモリダンプ

x/[長さ]h [アドレス]

ハーフワード単位でのメモリダンプ

x/[長さ]w [アドレス]

ワード単位でのメモリダンプ

x/[長さ]i [アドレス]

逆アセンブラ

list

ソースコードの表示

b ソースコードの行数

ブレークポイントの設定

b *アドレス

ブレークポイントの設定

delete b

ブレークポイントの削除

si

アセンブラの1命令ずつ実行

next

Cのソースを1行ずつ実行

 
 

リスト3 ARM用GDBでよく使用されるコマンド

 GDBにはこの他にも数多くのコマンドがあります。詳しくはGDBの解説文献をごらんください。

Insightとの接続方法

アップウィンドテクノロジー・インコーポレーテッド社は、開発した組み込み開発用のGNUソフトウェアをまとめたGNUWingというものを開発しました。GNUWingにはGCCやGDBのほか、InsightというGDBの操作をGUI上で行うことができるツールが含まれています。InsightはLinuxやCygwin上から動作します。

例えば、CygwinでInsightを実行するには、Cygwin上で arm-elf-insight.exe を実行します。

Insightを起動すると、図5のような画面が開きます。

図5 Insightの起動画面

 リモート接続を行うためには、メインメニューの「File→Target」を実行します。

?

 図6のようなダイアログが開くので、TargetにRemote/TCPを選択し、HostnameとPort番号は適切に設定し、OKボタンを押します。

図6 Insightのリモート接続設定

?

Insightのメインメニューから、「Run→Connect」を実行すると、接続成功のメッセージが表示されます。この時点でレジスタダンプなどが使用できるようになります。

接続できることがわかったら、一度Insightを終了するか、Disconnectします。

?

開発したプログラムをダウンロードして実行するには、Insightの起動後、メインメニューから「Run→Run」を実行します。「Run->Run」を実行すると、ファイル名を選択するダイアログが開きますので、作成したelfファイルなど、ダウンロードしたいファイルを選択します。

「Run->Run」を実行すると、リモート接続とプログラムのダウンロードが実行され、CPUはmain関数の入り口で停止します。InsightはターゲットCPUが停止したことを認識できないので、ツールバーのSTOPボタンを押してInsightに制御を戻します。

Insightに制御が戻ると、ソースコードが表示されmain関数の入り口で停止していることがわかります。

図7 Insightの使用画面

あとは、Insight上でステップ実行やソースコードを含めた協調デバッグを存分にご利用ください。