前回まででコードのクロスコンパイルをeclipse上で行うところまで出来たので、今回はデバッグについて設定を行っていきたいと思います。ターゲット上で動いているプログラムに対するデバッグとなるので、リモートデバッグを設定するという感じになります。
gdbserverを手動で起動する系
まずはターゲットでgdbserverを手動で動かして、そこに eclipse が接続を行う、というタイプで設定してきます。どこに問題があるか切り分けるためにも、まずはここから設定します。ワンタッチでリモートデバッグという点については後半で説明します。
コンパイル後出来上がったターゲット用のelfファイルをターゲット(実機)へ転送します。デフォルトだとDebugフォルダ以下に出来ていると思います。 Remote System Explorer パースペクティブを開いて、そのファイルを sftp 経由でターゲットの適当な場所へコピーします。
ここでは、 Jetson TK1 ターゲット標準ユーザーである ubuntu ユーザーのホームにプログラムを送ることにしました。
エクスプローラーからファイルを Remote Systems タブ内へのドラッグアンドドロップで任意の場所に転送できます。( eclipse 内でファイルのD&Dする方法はちょっと見当たらず・・・)
ターゲットでの操作
プログラムを転送したら、ターゲットでgdbserverでそのプログラムを実行します。
eclipse の Remote Systems から ssh Terminal を起動して操作するか、ターゲットのキーボードをたたいてコマンドを実行して下さい。
初回の転送後はファイルが実行属性が付いていないので、それも設定する必要があります。
$ chmod +x HelloWorldArm $ gdbserver :2345 HelloWorldArm
実際に待っているとこうなります。
eclipseのデバッグ設定
この待ち受けしているターゲットに対して、gdb接続をするための設定を行っていきます。
プロジェクトを右クリックして、 Debug As / Debug Configuration を選んで、設定画面を出して下さい。
そして、「C/C++ Application」を選んで、 New Launch Configuration ボタンを押してコンフィグを作成します。作成すると以下のような感じになると思います。
そして、画面下部のほうにある 「Using GDB(DSF) Create Process Launcher – Select Other 」 のリンク部分をクリックして、次のように設定します (Standard Create Process Launcher を選択)。
次に、Debuggerタブを開きます。そして以下の設定に変更します。(Standard Create Process Launcher を選択しないと以下の設定ができないんです)。
- Debugger: gdbserver
- GDB Debuger: D:\Linaro\gcc-linaro-arm-linux-gnueabihf-4.8-2014.04\bin\arm-linux-gnueabihf-gdb.exe
上記を見てわかるとおり arm-linux-gnueabihf-gdb.exe のフルパスが入っています。ここは各自の環境に合わせて修正してください。
この中の「connection」タブを開き、以下のように設定して下さい。
- Type: TCP
- IP Address: ターゲットのIPアドレス
- Port Number: 2345
これらの設定が終わったら、Apply ボタンを押して、Debug ボタンを押してデバッグを開始します!!
うまく設定ができていれば以下のようにブレークポイントを設定したところで停止します。
全てを自動で!ボタン1つでリモートデバッグを開始
今までのものがうまくできていれば、もう後一歩で手軽なリモートデバッグができるようになります。ここで実現することは、ビルドしたファイルを転送し、 eclipse のデバッガ操作を受け付けるようにする、といったものです。すなわち前章で手作業をした部分ですね。
ターゲットの設定
今回は特に必要ありません。gdbserverがパスの通った場所に配置されていればOKです。
eclipseの設定
先ほどと同じですが、デバッガ設定の部分が異なります。ですので、Debug Configurationの画面を開きます。
今度は「C/C++ Remote Application」を選んで、 New Launch Configuration ボタンを押してコンフィグを作成します。作成すると以下のような感じになると思います。
ここで先ほどと同様に、画面下部のほうにある 「Using GDB (DSF) Automatic Remote Debugging Launcher – Select Other 」 のリンク部分をクリックして、次のように設定します ( Standard Remote Create Process Launcher を選択)。
すると戻ったときに画面が変わりますので、以下のように編集します。基本的には、以前に作成した接続情報を選択したり、実行体バイナリを配置するパスを記入したりといったことになります。
みてわかるとおり、実行前の処理で実行属性をつけています。続いて、Debugger タブを開いてさらに設定をおこないます。
基本的には、さきほどやったように使用する gdb のフルパスを入れたり、プロトコルを設定したりします。
ここでプロトコルを「mi2」に指定してます。これがポイントで、 default, mi1 とか設定の場合、自分の環境ではうまくデバッグ接続を確立できませんでした。
設定が終わったら、 Apply ボタンを押して、 Debug ボタンを押して、リモートデバッグを開始します。うまくいけば以下のようにブレークポイントで停止した状態になると思います。
まとめ
ようやくボタン1つでリモートデバッグができるところまでたどり着けました。しかも基本 Windows 環境なので、通常Windowsを使っているユーザーには開発の敷居が低くなった、と自負しております。 VMPlayer に Ubuntu などの Linux 環境を入れてそこで開発するスタイルに比べれば、動作が比較的軽いと思いますし、その点でも環境はよくなったと思います。
今回、makeの都合で若干MinGWのお世話になってしまいますが、それでも cygwin よりはまだWindowsよりといっていいと思います。cygwin でコンソールでがんばって開発するスタイルもまたアリだと思いますけど、やっぱりデバッギングは GUI が色々とあった方が効率よいですしね!
今回は Jetson TK1 で行いましたが、他のターゲット(Raspberry PIや類似基板、他のボードなど)でも、そこそこ同じ手順で環境実現出来るんじゃないかと予想しています。またそれらのものを触る機会があったらご報告したいと思います。やってみた方のコメントもまた募集しておきたいと思います。
コメント
私の環境では”Standard Create Process Launcher”が優先ランチャーの選択で出てこないのですがEclipseのバージョンに依存する情報でしょうか?
・GDB(DSF)Automatic Remote Debugging ランチャー
・GDB(DSF)Manual Remote Debugging ランチャー
・Legacy Remote Create Process ランチャー
しか表示されていません。Eclipse Kepler日本語版を用いてます。
申し訳ありませんが、こちらは Indigo の環境でしか確認が取れていないため、Keplerではどうかとかちょっとわからないですね。
そのうちまた環境準備して試してみたいと思います。
回答ありがとうございます。接続はできたんですが、デバッグ時にブレークポイントで止まってくれず困っていました。こちらもIndigoで入れなおして試してみます。ありがとうございました。
Indigoを入れてためしてみましたが、下記ページの(5)番と同じ現象がおきデバッガーの選択画面にgdb debuggerが表示されない現象が起きるようです。(バグ?)
http://mon80.blog.fc2.com/blog-entry-440.html
Jetson TK1向けのドライバ製作の為にいろいろ試して見ていますが、linux-headersが3.10.40向けは存在しなかったり色々と苦戦しますねえ。
Indigoを使い続けていましたが最近のバージョンを確認してみたところ、結構昔のバージョンとなってしまっていることに驚きました・・・。
これはちょっとマズイと思いましたので、Kepler や Luna あたりでこの手順適用して開発に使えるのか試してみたいと思います。
Jetson TK1 や MIPS CI20 とか、今年で始めた物はやはりまだ日が浅いこともあってか、色々と大変なことが多いですね。