なんとかなるさね

マイコンをネタにブログを始めてみました


QEMU | UbuntuのネイティブなGDBSERVERをインストールして動かしてみた 

UbuntuのQEMU(のユーザランドエミュレーションモード)のGDBSERVER機能を試していたところ、ちょっと
腑に落ちない点があったので、比較のためにネイティブなGDBSERVERをインストールして動かしてみました。
とりあえずウィンドウを2つ開いて、一方でGDBSERVERを、もう一方でGDBを、それぞれ起動してみました。
今回も、いつものLinux Arduinoスケッチ(sketch_jan10a.cpp.elf /dev/ttyS1 /dev/ttyS2 /dev/ttyS3)なの
ですが、メッセージの出力先を/dev/ttyではなくて/dev/ttyS1にして、VMware Playerのハードウェア仮想化
されたCOMポートに接続されたTeraTermに表示させるようにしました。(そのようにした理由は、後で行う
QEMUの腑に落ちない点の調査がやり易いかもしれないと思ったからですが、当てが外れるかもしれません。)

GDBSERVER側のコマンド

gdbserver :2159 build/sketch_jan10a.cpp.elf /dev/ttyS1 /dev/ttyS2 /dev/ttyS3

GDB側のコマンド

gdb -ex="target remote :2159" build/sketch_jan10a.cpp.elf

なお、":2159"は、大々々昔に試していたV850 GDBSERVERのドキュメントに書かれていたものを、それ以来
ずっと使い回しているだけで、数値に何か意味がある訳ではないです。

ちなみに、以下の動作例ですが、GDBのcコマンドで実行を開始させた後、^Cキーで実行を中断させています。




また、main()関数、setup()関数、loop()関数にブレークポイントを設定して、それぞれ停止させることも出来
ました。(inoファイルが見つからないのは、多分、inoファイルに対しては、パス情報が付加されていないから
だと思います。これに関しては、GDBのコマンドでファイル検索パスを設定してやれば解決すると思います。)



gdbserverパッケージは、以下のようにインストールしました。

sudo apt-get install gdbserver



なお、Linux Arduino互換ライブラリのソースコードをUbuntu/Linaro x86 Linux GCC 4.7.3でビルドしました
が、その手順は以前のエントリで書いたものと基本的に同じです。(ただし、stripコマンドを実行しないように
スキップさせています。) また、試したスケッチも、以前の別のエントリで書いたものと同じです。

追記 : メモ

Linux Arduino互換ライブラリのソースコードをi586-poky-linux-uclibc GCCでビルドし、このGDBSERVERで
試したところ、GDB単体で試した時と同様にGDBでワーニングが表示されてしまったものの、一応、動きそう
でした。(ひょっとすると、GDBは自動的にデバッグ情報付きビルドの共有ライブラリを探すようになっていて、
実際に読み込まれているデバッグ情報無しビルドの共有ライブラリとの何かしらの不整合を検出してしまって
いるのかも? 例えば、デバッグ情報の有無だけではなく、最適化オプションなどが異なっていたりするのかも?)



追記 : 補足

OS対応版のGDBSERVERを動かすのは、実は、今回が初めてです。もっと便利な使い方があるかもしれません。

関連記事

2014/01/31   blog-entry-415   category: Arduino Lib & CrossGCC

go page top