はじめに
こんにちはー!今回は、Linuxで動作するCのデバッグ環境の整え方をお話しします。
皆さんは、Raspberry PiとかのLinux上で動作するプログラムを作るときにどうしていますか。Raspberry Pi 上で make して色々プログラムを作っていくのもいいですが、コンパイルの速度が遅いですし、効率も落ちてしまいます。
では、どうすればいいのか。Windows環境で一番簡単なのは、Linux上のプログラムを作ってテストしたいと思った時に、仮想環境でLinuxを起動させてPCでmakeしていく方法です。
ただ仮想環境は重たい切実な問題があります。そこで、今回はできる限り軽い仮想環境を作って、Cプログラムをデバッグ出来る方法まで説明します。
Linux環境の選択
まず、Linuxといってもたくさん派生しており、色々な環境があります。そのため、仮想環境上でも動作が軽快なOSもあるはずです。
まずはベースとなるLinux選びを行います。
OSの紹介
OSの説明です。有名どころをいくつか紹介します。
RedHat系
RHEL(Red Hat Enterprise Linux) / CentOS / Fedora 等のサーバー向けのOSです。RHEL は、有料のOSであるため、サポートや情報が多く、サーバーに使用されることがおおいです。
CentOS は、RHEL の無料版です。サポートが受けられませんが、信頼性が高い RHEL を使えるような形です。
Fedora は、新しい機能を追加していくOSです。最新の機能を試したい向けです。
Debian GNU/Linux
フリーのOSを作成する団体Debianが開発したLinuxベースのOSです。搭載アプリは安定版のため少し古いですが、信頼性は高くネットの情報も多いです。Debianから多くのOSが派生しており、Raspbianなど組み込み向けLinuxも作られることが多いです。
Ubuntu
Debian ベースのOSで、個人向けだと有名なOSです。デスクトップPC向け用、サーバー用途用の2種類あり、様々なカスタマイズがされています。利用者が多いため非常に情報量が多いです。
Arch Linux
必要最低限の物しか入っておらず全てを自分でカスタマイズする超上級者向けOSです。
BSD系
上の3種類と違ってLinuxではありませんが、よく耳にするOSなので紹介します。
Linux系のOSは、総じてGPLなのですが、BSD系のOSは、BSDライセンスとなります。製品に組み込む際にBSDがよいといった場合に選ばれるOSです。
どのLinuxを選択するのか
結論からいいますと、Debian を今回選択しました。この理由はカスタイマイズされた Ubuntu は、有名なOSで情報量も多いのですが、デバッグ環境だけに限れば、必要がないアプリがインストールされるためです。
また、Debianは、Raspbianなど組み込みLinuxでベースとされることが多いため、Debian での環境で何か開発すれば、それを他の組み込みに持っていくのが楽かと考えたためです。組み込み機器製品のArmadilloでもDebianを使用しています。
デスクトップ環境の選択
Linuxを知っている方ならご存知ですが、デスクトップ環境は好きなものが選べます。ここで選ぶものによって、非力なPCでは重たくなってしまいます。
Debian では、インストール中にいくつかデスクトップ環境を選ぶことができます。
デスクトップ環境の種類
Unity, GNOME
これから紹介するもに比べるとグラフィカルでUIが洗練されていますが、その分メモリやパワーを使用します。Ubuntu のデスクトップ環境を選ぶと標準で利用されます。(Unity は Debian では選べません。)
Xfce
昔からあるGUI環境のため、現在のPCでは軽快に動作する特徴を持っています。
LXDE
歴史は浅いですが、処理能力の低いPC向けに作られた環境です。軽快に動作することを目的としています。
どのデスクトップ環境を選択するのか
今回は、LXDEを選択します。目的が軽さというのがよいですし、デバッグ環境のみに使用するという目的とマッチしています。
デバッグ用ツール
今回、Windows でもよく使用される Eclipse を使用したいと思います。
開発環境を整えよう
全ては記載しませんが、流れを説明します。
前準備
次の環境を用意します。
Oracle VM VirtualBox
仮想環境です。今回は 5.2.4 を使用します。仮想環境は、スナップショットという機能を使うことで誤った設定をしても以前の段階に戻れるためおススメです。VMware という選択肢もありますが、商用利用に制限があるためこちらを選択しました。
Debian
インストール方法を解説します。「Debianのサイト」で「Debian を入手する」→「ネットワークインストール」→「最小の CD を使って、ネットワークインストールする」を選択します。「netinst CD イメージ (約 150-300 MB ですがアーキテクチャよって変わります)」の中にある「i386」を選択して「debian-9.3.0-i386-netinst.iso」をダウンロードします。(x86用OSを想定)
ネットワーク環境
プロクシなしで、ネットワークに接続できる環境を準備します。
VMで仮想環境を作成
新規作成する
- 「Oracle VM VirtualBox」を起動して、「新規」を選択します。
- タイプはLinux、バージョンはDebian(32-bit)を設定します
- メモリサイズは緑の範囲で出来る限り多くとります。
- ハードディスクでは「仮想ハードディスクを作成する」を選び「作成」。
- ハードディスクはVDIを選択。サイズは可変サイズを選択
- 「ファイルの場所とサイズ」になったら、HDDファイルの場所を設定してください。
場所やファイル名は変更がすこし大変なので注意してください。また、ハードディスクのサイズは120GBほどに設定しましょう。ハードディスクのサイズは、後で変更する場合、非常に困難なので極力大きめにします。
設定変更する
新規作成すると左側の領域に作成した仮想環境が表示されます。これを選択した状態で「設定」を選ぶと、より設定変更が行えます。次のように設定していきます。
- 一般の高度で、クリップボードの共有を双方向にする
- システムのプロセッサーで、CPU数を増やす
- オーディオとUSBは無効化する(使用しないため)
- ネットワークはNATとなっていること(外部にアクセスするため)
OSのインストール
- 作成したプロジェクトを選び、起動を選びます。
- 最初にISOを選択する画面が表示されるため「debian-9.3.0-i386-netinst.iso」を選択します
- インストール方法は、グラフィカルじゃないインストール方法 Install を選択します。
- あとは適当に進めていきます。途中で言語の設定が出た場合は「日本」を選びましょう
- 途中で、初期インストールの設定が出たら、「LXDE」と「SSH サーバー」を選びましょう
- あとは適当に進めていけばOSのインストールが完了です。
CUIで操作する場合は、矢印キーとスペースキーで選択し、エンターキーで決定です。
OSの初期設定を行う
ターミナルを駆使して設定していきます。スーパーユーザー権限で行うことが多いのでsudo su -
と入力しておくと楽です。
パスを英語化する
「デスクトップ」とかフォルダパスに日本語が入っているとやり辛いので最初にやります。
- xdg-user-dirs-gtk をインストールして、updateを実行します。
sudo apt-get install xdg-user-dirs-gtk LANG=C xdg-user-dirs-gtk-update
Guest Additions CDをインストールする
Guest Additions CD とは、VM上で動くOSでインストールすることで、共有フォルダや画面解像度変更、クリップボード共有など色々と使いやすくなるツールです。
- VMのメニューバーにある「デバイス」→「Guest Additions CDイメージの挿入…」
- CDが認識されます。このままだと実行できないので、一旦ディスクのフォルダをデスクトップへコピー(cdrom というフォルダにします)
- 実行する前に、実行に必要なソフトをインストールします。
sudo apt-get update sudo apt-get upgrade sudo apt-get install dkms sudo apt-get install build-essential module-assistant sudo apt-get install linux-headers-686 linux-headers-4.9.0-4-686 ※Linuxの部分は、DebianのLinuxカーネルのバージョンに依存する そのため、下記のVBoxLinuxAdditions.runを実行すると 必要なインストールファイルが表示されるのでそれを参考にするよい
- Guest Additionsをインストールして再起動
cd /home/***/Desktop/cdrom sudo ./VBoxLinuxAdditions.run sudo reboot
※もし「VBoxLinuxAdditions.run」でエラーが出た場合は表示内容をインストールする。それでも駄目なら、VirtualBoxを最新版にする。(Debianのリリース日より新しいバージョンだと確実。)
- Guest Additions CD を取り出す(VMのメニューバーにある「デバイス」→「光学ドライブ」から除去的なのを選ぶ)
共有フォルダの設定
Windows上とファイルの行き来する際に、共有フォルダを作ると便利です。
- VMのメニューバーにある「デバイス」→「共有フォルダー設定…」
- フォルダの追加ボタンで、ダイアログを表示させる
- フォルダのパスを入力する部分で、右端の▼を押して「その他…」を選び、フォルダを選択
- 「自動マウント」と「永続化する」を選びOKを押す
- OSを再起動
- 共有フォルダ「
/media/sf_***
」への権限を付与
sudo gpasswd -a ユーザ名 vboxsf
- OSを再起動
不要なファイルを削除する
いらないファイルは予め削除しちゃいましょう。下記のコマンドで、オフィスツールや画像編集ソフトをアンインストールできます。
sudo apt remove libreoffice* sudo apt remove gimp* sudo apt remove firefox* sudo apt-get autoremove
あると便利なソフトをインストールする
コンパイルに必要なmakeやファイルサーバーのsambaは必須!よく使うので。
sudo apt-get install make 以下、おすすめ sudo apt-get install samba sudo apt-get install curl sudo apt-get install aptitude sudo apt-get install php
サーバーを自動起動させる
SSHやSAMBAの設定を好みでしておきましょう。
Eclipseのインストール
Eclipseをインストールしていきます。
ここからは「Synaptic パッケージマネージャ」を使用していきます。「Synaptic パッケージマネージャ」というのは、アプリストアみたいなものです。
- スタートメニューから「設定」→「Synaptic パッケージマネージャ」
- 次の4つを選択した後に適用を押し、インストールします。
- eclipse(本体)
- eclipse-cdt(C/C++開発用)
- pleiades(eclipseの日本語化)
- gdb(gccのデバッグ支援機能)
- スタートメニューから「プログラミング」→「eclipse」を選択して、起動させて終了させる。
- 日本語化のために次のように「
eclipse.ini
」を開く
sudo nano /usr/lib/eclipse/eclipse.ini
- 最終行に次の1行を追加して上書きする。
-javaagent:/usr/lib/eclipse/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar
- ターミナルで次のコマンドをうつ。
eclipse -clean
- これでC言語でデバッグ環境の準備を終えました。
デバッグしてみよう
ここからは、通常のeclipseの使い方と同じです。
ここについては次の記事により詳細なデバッグ手順を記載しています。
「Linuxで動作するCプログラムのデバッグ環境構築2」へつづく
その他よくやる手順メモ
配布用のサイズを縮小する方法
仮想環境で作るメリットとして、一旦作ってしまえば、面倒な環境構築無しで、他のパソコンでもすぐに実行できるということがあります。ただ1つ問題がありまして、この仮想環境のファイルシステムはどんどん大きくなっていきます。可変サイズという設定にしているので、使用しなくなったらサイズが減ると思っているかもしれませんが、残念ながら減ることはありません。
配布する際にこのようにファイルサイズが巨大になったまま配布すると扱いが大変なので、縮小させる方法を紹介します。
- ゴミ箱は空にしておく
- スナップショットを使用しているならば、統合するためにスナップショットを全て統合させる。
- 仮想OS上(Debian)で次のコマンドをうつ
sudo dd if=/dev/zero of=zero bs=4k; rm zero
- 仮想OSをシャットダウン
- Windows上で管理者権限でコマンドプロンプトを起動させる
- VirtualBox のインストール先にカレントディレクトリを移動させる
- 「
VBoxManage list hdds
」で縮小させるVDIのUUIDを調査する - 「
VBoxManage modifyhd [UUID] --compact
」で縮小させる - 圧縮ソフト7-zipを使って、7z形式で高圧縮させる
常にスーパーユーザーになる
あまりおすすめしませんが、重要なコマンドを続けて実行する場合は常にスーパーユーザーになると楽です。
sudo su -
と実行し、自分のログインパスワードをうてばrootになれます。
なお、ifconfig等のコマンドは、スーパーユーザーでなければ、パスが通っていないため実行できません。
/sbin/ifconfig ifconfigを使わないのであれば、以下でも実行可能。 ip a show
もし、どのユーザーでもifconfigを使いたいのであれば、
sudo nano /etc/profile
でファイルを開き、
if [ "`id -u`" -eq 0 ]; then PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" else PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games" fi
内部のスーパーユーザーかどうかif分判定しているelseの方のパスの設定を
PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/sbin"
とする必要があります。
コメント