📝

VisualStudio2017でLinuxアプリのリモートデバッグ

2018/06/01に公開

はじめに

VisualStudio2017 で簡単に Linux 向けアプリのデバッグができるとのことで,試した記録を残します.

VirtualBox の設定

ホスト OS からゲスト OS への ssh 接続

ホスト OS からゲスト OS へ ssh 接続を行えるよう,VirtualBox の設定を行います.
1.ssh 接続を行うゲスト OS の仮想マシン設定から,ネットワークに NAT を追加.
[追記]
下記設定でやるならここでホンストオンリーアダプターも追加する必要がありますね.ssh 接続するときはここで追加したホンストオンリーダプターに割り当てられている IP に対して行うといけるはずです.
ネットワーク設定
2.NAT 設定にしたアダプタの高度設定からポートフォワーディング設定を開き,ssh 用の設定を追加.
ポートフォワーディング設定

必要なツール類のインストール

ここで openssh-server,g++,gdb,gdbserver をインストールします.既にインストール済みの場合は不要です.
1.ゲスト OS のシェルで以下を実行.

sudo apt install openssh-server g++ gdb gdbserver

2.ゲスト OS にて以下コマンドを実行し,ssh サービスを実行.

sudo service ssh start

VisualStudio2017 の設定,実行

プロジェクトの作成

Visual C++のクロスプラットフォームの Linux を選択し,コンソールアプリケーションを作成します.
プロジェクト作成
※ここで当該選択肢がない場合は,インストーラから「C++による Linux 開発」を選択し,インストールしてください.
Linux開発用環境追加

実行するコードの作成

ここで日本語を表示しようとするとソースファイルが Shift-JIS のため,文字化けが発生します.そのため,テキストエディタ等でソースファイルの文字コードを UTF-8 に変更してください.
また,linux 固有の関数等はインテリセンスが使用できません.使用したい場合は Linux 上の/usr/include を Windows 側にコピー,追加のインクルードディレクトリに登録する必要があります.もしくは Samba で共有させて,それをインクルードディレクトリに登録することでも可能なようです.
[参考]https://docs.microsoft.com/ja-jp/cpp/linux/configure-a-linux-project#vc-directories
[参考 2(Samba 共有)]https://qiita.com/mt08/items/5070df64e5af2285d5b5#おまけ

[追記]
VS2017 のバージョンを新しくしていれば,自分でインテリセンス用の設定を行わなくても,VS 側がダウンロードして設定してくれるようですね.

maint.cpp
// テスト用
#include <iostream>
#include <pthread.h>


static void* test_thread(void* arg)
{
	char* msg = (char*)arg;
	std::cout << msg << "\n";
	pthread_exit(NULL);
}


int main()
{
	pthread_t thread1;
	char* msg = "Test Thread!!";

	if (pthread_create(&thread1, NULL, test_thread, (void*)msg) != 0)
	{
		std::cout << "error\n";
		return -1;
	}

	pthread_join(thread1, NULL);

	return 0;
}

ライブラリのリンク等

プロジェクトのプロパティから,「リンカー」->「コマンドライン」の追加のオプションに追加することでライブラリリンク等ができます.
今回は pthread を使用したいので「-pthread」を追加します.
オプション追加

コンソールの起動

VisualStudio のツールバーのから「Linux コンソール」を起動してください.ここに標準出力に出力した内容等が表示されます.
Linuxコンソール起動
Linuxコンソール

デバッグ実行

デバッグ実行を行うと初回のみ以下のような画面がでてきますので,ゲスト OS の設定に従って設定を行ってください.

項目 設定内容
ホスト名 ゲスト OS の IP アドレス
ポート 22
ユーザ名 ゲスト OS のユーザ名
認証の種類 パスワード
パスワード ユーザ名で入力したゲスト OS のユーザのパスワード

初回実行.JPG

設定の入力が完了し,接続ボタンを押下すると,ビルドが走りデバッグ実行が開始されます.
デバッグ実行.JPG

まとめ

以上で最低限 VisualStudio2017 から Linux 向けアプリのリモート実行を行うことができます.
VisualStudio で Linux 向けのアプリのコーディング,デバッグを行えるのは便利でいいですね.

補足

補足 1

一度設定したリモートデバッグ先の情報は VisualStudio のツールバーの「デバッグ」->「オプション」->「クロスプラットフォーム」にあるので,ここで削除や新たに追加することも可能です.
ビルド先設定.JPG

補足 2

ビルド時に生成される実行ファイル等は,ゲスト OS のログインしたユーザのホームディレクトリの「projects]フォルダ内にプロジェクト名と同一のフォルダ名で作成されます.
ゲストOS実行ファイル.JPG

参考資料

Linux プロジェクトのデプロイ、実行、デバッグ
https://docs.microsoft.com/ja-jp/cpp/linux/deploy-run-and-debug-your-linux-project
Linux プロジェクトの構成
https://docs.microsoft.com/ja-jp/cpp/linux/configure-a-linux-project#vc-directories
[メモ] Visual C++ for linux Development で OpenGL
https://qiita.com/mt08/items/5070df64e5af2285d5b5#おまけ

追記

実際に使っていて発生した問題と解決策

コンパイルができない

原因

GNU C ライブラリを更新していなどの原因で,ビルド時に必要なファイルが見つからず,コンパイルエラーとなっていたようです.

解決策

GNU C ライブラリ(libc)関連を更新/インストール,その後再起動を行うことで解決しました.
以下コマンドでパッケージの更新を行うのが一番手っ取り早いと思われます.

sudo apt update
sudo apt upgrade

個別に必要なもののみインストールを行いたい場合は多分以下でいけると思います.(これは過不足あるかもしれないです.)

sudo apt update
sudo apt install libc6-dev
sudo apt install libc6-amd64
sudo apt install libc6-dev-amd64
sudo apt install build-essential

root 権限が必要なコードを実行できない

原因

見出しの通りです.
pthread の FIFO スケジューリングを使用しようとしたとき,root 権限が必要となってしまいます.
しかし設定通りの環境で実行すると,root 権限で実行することができないため,思うように動作しません.

解決策

わりと強行策ですが,単に ssh 接続に root ユーザを許可するようにしただけです.
「/etc/ssh/sshd_config」の「PermitRootLogin」を"yes"に変更.
以下コマンドで root ユーザのパスワードを設定

sudo passwd root

VS2017 側から ssh 接続先に root ユーザのものを追加し,以降それを使用するようにする.

静的ライブラリのリンクができない

原因

設定時に記載した箇所に「-l◯◯」を記載する場合,コンパイルオプショとしてはコンパイル対象のソースコードの記載よりも前に記載されてしまいます.
そのため,math ライブラリなどのコンパイル対象のソースファイルの記載よりもあとにライブラリのリンクオプションを記載しなくてはいけないライブラリのリンクができなくなってしまいます.

解決策

「プロジェクトのプロパティ」→「リンカー」→「すべてのオプション」→「追加の依存ファイル」の後ろに「-l 〇〇」を追加することで,コードファイルの記載よりもあとに展開されるため,問題なくコンパイルが行えます.
リンク.JPG

[参考]
https://blogs.msdn.microsoft.com/vcblog/2016/03/30/visual-c-for-linux-development/#verbose

Discussion