visual studio 2017のクロスプラットフォーム開発機能を使って、WindowsからLinuxのリモートビルド、デバッグする

2019.05.09
<VisualStudioでLinux上のC言語で開発したアプリケーションのデバッグができたので、備忘録として手順を記載>

visual studioのクロスプラットフォーム開発機能と、LinuxのGDBとの組み合わせで比較的簡単にWindowsからリモートでLinux側にソースコードの自動デプロイ、実行バイナリのビルド、デバッグができます。基本的には、VisualStudioとLinuxにはGDBサーバーをインストールすればOKです。

1.試した環境(Linux上のシステム構成)

今回の環境としてLinux側には下記のような構成でアプリケーションが配置されているものとします。

①/home/test/source/prj001/prj001.c

#include <stdio.h>
int main(int argc, char* argv[])
{
    int num = 0;
    printf("Hello world!!\n");
    while(1)
    {
        printf("Input num=>");
        sub1(&num);
        printf("num=%d\n", num);
        if(999 == num)
        {
            break;
        }
    }
    return 0;
}

②/home/test/source/prj001/sub1.c

#include "prj001.h"
void sub1(int* num)
{
    scanf("%d", num);
    return;
}

③/home/test/source/prj001/prj001.h

#include <stdio.h>
void sub1(int*);

④/home/test/source/prj001/makefile

GDBを使用する為「-g -O0」オプション記述が必要!

CC=gcc -g -O0

OBJPATH = ./obj
EXEPATH = ../../exe
TARGET = $(OBJPATH)/prj001
OBJS = $(OBJPATH)/prj001.o\
       $(OBJPATH)/sub1.o
HDRS = ./prj001.h
EXTHDRS =
CFLAGS = -I/usr/include\
         -DLINUX -D_SVID_SOURCE
LDFLAGS =
LDLIBS = -lpthread -lm
all: $(TARGET)
clean:
        rm $(OBJPATH)/*
install:
        cp $(TARGET) $(EXEPATH)
$(TARGET) : $(OBJPATH) $(OBJS) $(HDRS) $(EXTHDRS)
        $(CC) $(OBJS) $(LDFLAGS) $(LDLIBS) -o $@
$(OBJPATH) :
        mkdir $(OBJPATH)

SRCNAME=prj001
$(OBJPATH)/$(SRCNAME).o : $(SRCNAME).c $(HDRS) $(EXTHDRS)
        $(CC) -c $(CFLAGS)  $< -o $@

SRCNAME=sub1
$(OBJPATH)/$(SRCNAME).o : $(SRCNAME).c $(HDRS) $(EXTHDRS)
        $(CC) -c $(CFLAGS)  $< -o $@
#
#.IGNORE :

⑤/home/test/exe/prj001  

←実行バイナリはこれ 。これをVisualStudioでデバッグしたい!

2.Linux側の設定

プログラムを実行するLinux側にリモートデバッグに必要なパッケージをインストールする。

$ sudo apt install gdb gdbserver

3.VisualStudioプロジェクトの作成

Linux-メイクファイルプロジェクトを選択。名前はリモートの対象プロジェクトのファイルが格納されているディレクト名称。

空のプロジェクトができる。

4.ソースファイルの配置

リモート(Linux)の対象アプリケーションのソースファイルをローカル(Windows)に配置し、プロジェクトに追加する。

5.ビルド

ビルドすると、リモートへの接続情報を聞いてくる。

接続すると、ビルド成功!・・・だが、この状態では実際はビルドされていない。ビルドはリモート上でmakefileに従って実行されるが、その為にはビルドイベントの定義が必要。

6.プロジェクトプロパティの設定コマンドの定義

リモートビルドイベントの定義を記述

リモートのビルド対象プロジェクトのパス設定

上記のように、デフォルトでは/home/(ユーザー名)/projectsの直下となっているので、これを実際のパスに設定。
ビルドした際にここで設定したパス直下のプロジェクト名のディレクトリにローカルのソースファイルがデプロイされる。

7.もう一度ビルド

今度は「出力」ウィンドウにそれっぽい出力があり、ビルド成功。リモート側を見てみると、実行バイナリが生成されていることを確認!

8.デバッグ

今回はリモートで実行中のプロセスに対して、ローカル側からアタッチしてデバッグしてみる。

(リモート)

(ローカル)

「プロセスにアタッチ」でSSHの接続先を入力し、対象のプロセスにアタッチすると・・・

デバッグできました!赤色の波線はローカル側でのパスが通っていない為。ビルドはリモート側で実行されているので問題ないが、タグジャンプしたいファイルがあれば、事前にローカル側にコピーが必要。

(文責:川谷)