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を動かすのは、実は、今回が初めてです。もっと便利な使い方があるかもしれません。
腑に落ちない点があったので、比較のためにネイティブな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を動かすのは、実は、今回が初めてです。もっと便利な使い方があるかもしれません。
- 関連記事
-
- OSエミュレータ | Intel Galileo LinuxバイナリをWindows上でAtratusを使って実行しようとして失敗
- OSエミュレータ | LinuxバイナリをWindows上で実行するAtratusというソフトウェアを試してみた (2)
- OSエミュレータ | LinuxバイナリをWindows上で実行するAtratusというソフトウェアを試してみた→×
- QEMU | VMware Player上のUbuntuでMinGW32 GCCをapt-getしてインストールしてみた
- QEMU | ARM (Linux非対応) Insight-7.4でARM Linux Arduinoスケッチをデバッグ
- QEMU | UbuntuのARMユーザランド + ARM Linux GDBでARM Linux Arduinoスケッチをデバッグ (2)
- QEMU | UbuntuのARMユーザランド + ARM Linux GDBでARM Linux Arduinoスケッチをデバッグ→△
- QEMU | UbuntuのネイティブなGDBSERVERをインストールして動かしてみた
- QEMU | Ubuntuのchroot機能とマルチアーキテクチャ機能を使ってARM Linux Arduinoスケッチを実行
- QEMU | Ubuntuのchroot機能でCEV-RZ/A1L Linuxのルートファイルシステムをエミュレーション
- QEMU | Ubuntuのマルチアーキテクチャ機能を使ってARM Linux Arduinoスケッチを実行
- QEMU | CEV Linux SDK V2.00.00 GCC 4.7でビルドしたARM Linux ArduinoスケッチをQEMUで実行
- QEMU | Linaro ARM Linux GCC 4.7でビルドしたARM Linux ArduinoスケッチをQEMUで実行
- Arduino IDE | Linux Arduino互換ライブラリをCEV Linux SDK V2.00.00 GCC 4.7でビルド→正常終了
- Arduino IDE | Linux Arduino互換ライブラリをUbuntu/Linaro x86 Linux GCC 4.7でビルド→正常終了
2014/01/31 blog-entry-415 category: Arduino Lib & CrossGCC
| h o m e |