ARM用JTAG-ICE GDB
ARM用JTAG-ICE GDBとの接続
概要
|
MITOUJTAGに内蔵されたARM用JTAG-ICE(エミュレータ)は、GDBからの接続を受けることができます。この機能はGDBスタブと呼ばれます。 GDBスタブ機能を使うと、ネットワークを介して、GDBやInsightなど、他のデバッガのフロントエンドを活用することができます。また、遠隔地に置かれた機器のリモートデバッグも容易に可能になります。 GDBとの接続にはデフォルトではTCP/IPの2159番ポートを使用するようになっていますが、設定の変更も可能です。 |
|
?
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モードで起動 |
リスト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上でステップ実行やソースコードを含めた協調デバッグを存分にご利用ください。

