YoctoベースのLinux上での統合開発環境を使ったデバッグ方法

# はじめに
本記事は、YoctoベースのLinux上のアプリケーションを統合開発環境を使ってデバッグする方法をまとめたものです。
統合開発環境はARM社が提供するArm DS-5 Development Studioを使用します。

# 使用環境

**■ホスト**
OS : Ubuntu 16.04 LTS
Arch : AMD64
IPアドレス : 192.168.246.22


**■ターゲット**
ボード : NXP LS1043A RDB (Arm Cortex-A53)
Arch : AArch64
IPアドレス：192.168.246.23


**■ターゲット上のLinux**
Yocto : 1.6.1
Kernel : 3.19.3


**■統合開発環境**
・Arm DS-5 Development Studio のCommunity Edition (以下、DS-5 CE)

DS-5 Development StudioはArmベースのSoC上の組み込みC/C++ ソフトウェア開発向けのEclipseベースの統合開発環境であり、エディタ、コンパイラ、デバッガ、システム プロファイラを搭載している。
Community Editionは無償で利用可能な機能限定版です。

※以下より入手が可能。詳細はArmの公式ページを参照。
https://developer.arm.com/products/software-development-tools/ds-5-development-studio/editions/community-edition


# DS-5 CE を使用したデバッグ方法

## Toolchainの設定
Eclipse for DS-5 CEのウィンドウのメニューバーから設定をする。

1. ［ウィンドウ］ → ［設定］を選択。
2. ［DS-5］ → ［Toolchains］を選択。
3. ［追加］ → ［参照］からYoctoのToolchainを選択。<br>
例) /opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/aarch64-fsl-linux
4. ［次へ］ → 以下の画像のように正しくToolchainが登録されていれば［終了］を選択。

<img src="https://qiita-image-store.s3.amazonaws.com/0/204007/02649e5a-c633-dbba-75d6-8f97958c6de9.png" width=70% title="新しいツールチェインの追加画面">

## Hello Worldアプリケーションの作成
Eclipse for DS-5 CEのウィンドウのメニューバーから設定をする。

1. ［ファイル］ → ［新規］ → ［C プロジェクト］を選択。
1. ［プロジェクト名］に任意のプロジェクト名を記入。<br>
例) HelloWorld
1. ［プロジェクトの種類］ → [実行可能] → [Hello World ANSI C Project]を選択。
1. ［ツールチェイン］ → ”GCC 4.9.3[aarch64-fsl-linux]” → [終了]を選択。
1. [プロジェクト・エクスプローラー]に作成したプロジェクトが存在する事を確認。
1. プロジェクトのソースファイルのエラーを修正。<br>
※下記の「HelloWorld.c」に修正方法を示す。
1. プロジェクトの[プロパティ] → [C/C++ビルド] → [設定] → [ツール設定] → [GCC コンパイラ] → [その他] → [その他のフラグ]にYoctoのsysrootのパスを指定。<br>
例) --sysroot=/opt/fsl-qoriq/2.0/sysroots/aarch64-fsl-linux" <br>
※下記の画像に[プロパティ]の設定画面を示す。
1. 同様に[GCC リンカ] → [その他] → [その他のフラグ]にもYoctoのsysrootのパスを指定。
1. プロジェクトを選択して[ビルド]を実行。[デバッグ]ディレクトリの下にアプリケーションが生成されている事を確認。<br>
例) /home/user/DS-5-Workspace/HelloWorld/デバッグ/HelloWorld

```HelloWorld.c
#include <stdio.h>
#include <stdlib.h>

int main(void) {
	puts("!!!Hello World!!!"); /* prints !!!Hello World!!! */
	return 0; //EXIT_SUCCESSを変更する。
}

```


<img src="https://qiita-image-store.s3.amazonaws.com/0/204007/cfdd1217-e8c7-d468-30d8-155a0824e879.png" width=80% title="プロジェクトの[プロパティ]の画面">



## ターゲット ボード(LS1043A RDB)の準備
ターゲット ボード上でLinuxが起動している事を確認して、コンソールから操作を行う。


1. 上記で作成したアプリケーションを任意の箇所のターゲット ボード上に配置。<br>
`$ scp コピー元 コピー先`<br>
例) `$ scp user@192.168.246.23:/home/user/DS-5-Workspace/HelloWorld/デバッグ/HelloWorld /home/user/tmp`
2. 配置したアプリケーションを用いてgdbserverを起動。<br>
`$ gdbserver ターゲットボートのIPアドレス:ポート番号 アプリケーション名`<br>
例) ` $ gdbserver 192.168.246.22:1234 HelloWorld`
3. 以下のようにgdbserverが接続待ちになる事を確認。

```
$ gdbserver 192.168.246.22:1234 HelloWorld 
Process HelloWorld created; pid = 3351
Listening on port 1234

```


## DS-5 CEのデバッグの設定
Eclipse for DS-5 CEのウィンドウのメニューバーから設定をする。

1. ［実行］ → ［デバッグの構成］を選択。
2. ［DS-5デバッガ］を選択してダブルクリック。
3. ［名前］に任意の名前を記入。<br>
例) HelloWorld Debugger
4. ［接続］タブ → [ターゲットの選択] → [Linux Application Debug] → [Application Debug] → [Connections via AArch64 gdbserver] → [Connect to already running application]を選択。
5. ［gdbserver(TCP)］の[Address]にターゲットのIPアドレスを指定。 → [Port]に上記のターゲット ボードの準備で指定したポート番号を指定。<br>
例) [Address]192.168.246.23、 [Port]1234
6. ［ファイル］タブ → [ファイル] → [ワークスペース]を選択して、上記で生成したアプリケーションを選択。<br>
例) /home/user/DS-5-Workspace/HelloWorld/デバッグ/HelloWorld
7. ［デバッガ］タブ → [実行制御] → [シンボルからデバッグします]を選択。
8. [適用] → [閉じる]でデバッグの設定は終了。
※ [デバッグ]を選択するとデバッグが開始します。

## DS-5 CEのデバッグの実行
Eclipse for DS-5 CEのウィンドウのメニューバーから実行をする。

1. [実行] → [デバッグ]を選択する事でデバッグが開始。
1. [パースペクティブの確認]が出るため、問題がなければ[はい]を選択。
1. [DS-5デバッグ]ビューに切り替わった後にターゲット ボードのログインIDとPassを入力。
1. main関数でブレークしている事を確認。→ [続行]を選択する事でターゲット ボードのコンソールに以下が出力される。

```
$ gdbserver 192.168.246.22:1234 ls1043a 
Process HelloWorld created; pid = 3351
Listening on port 1234
Remote debugging from host 192.168.246.22
!!!Hello World!!!

Child exited with status 0
```

また、Eclipse for DS-5 CE上では以下の画像のようにGUI上でステップ実行ができたり、レジスタの値や逆アセンブリの内容を確認する事ができる。

<img src="https://qiita-image-store.s3.amazonaws.com/0/204007/ac34dc41-af71-a1a2-8e62-9d0475d68cfc.png" width=80% title="Eclipse for DS-5 CEのデバッグ画面">


----
『各種製品名は、各社の製品名称、商標または登録商標です。本記事に記載されているシステム名、製品名には、必ずしも商標表示（(R)、TM）を付記していません。』