Linux

Visual StudioでLinuxプログラムをWindowsでリモートデバックする方法

*記事内に商品プロモーションを含む場合があります

Visual Studioで、Linuxのアプリ(プログラム)をWindowsからリモートでデバッグする方法を紹介します。

Linuxの標準のデバッガのgdbを使うのは結構難しいので、LinuxのC/C++プログラミング初心者はVisual Studioでデバッグしてもいいかも知れませんね。

gdbもキー操作だけでデバッグできるので便利ですが、最初に学ぶには少しハードルが高いです。

Visual Studioのインストールや基本的な操作は以下の記事を参照ください。

初心者向け Visual Studio 2022 インストール/ビルド/実行方法Windowsのプログラミングで必要な『Visual Studio 2022』の紹介です。 (Visual Studio 2019でも...

この記事の動画を作成しています。Visual StudioとLinux画面を操作して説明しています。

検証環境&事前確認

■検証環境1 CentOS 7(この環境はgcc,gdbも古く、少しハマりました)
Linux: CentOS 7.6
Visual Studio 2022 Community (Windows)

Visual Studio は、 無料のCommunityエディションでもリモートデバッグ機能が利用可能です。

Linux上でコンパイルとデバッガがリモート実行されるので、gcc と gdbが必要です。

$ gcc –version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)

$ gdb –version
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.el7

Ubuntu 22.04.3 LTS  は、変なエラーなどの現象はなし。

Ubuntuでgcc/gdb/gdbserverのインストール

■検証環境2 Ubuntu 22.04

gccインスールは、開発パッケージをインストールします。

$ sudo apt -y update
$ sudo apt install build-essential

gdb インストール
$ sudo apt install gdb

gdbserverもインストール
$ sudo apt install gdbserver

Ubuntu22.04で 2023年11月時点では以下。

コンパイラのバージョンなどを気にする必要な開発でなければ、最新でOKです。

$ gcc –version
gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0

$ gdb –version
GNU gdb (Ubuntu 12.1-0ubuntu1~22.04) 12.1

手順

1.事前準備

Linux用のアプリを作成する場合は、Windowsで「Visual Studio Installer」を起動し、[変更]ボタンを押すとコンポーネントを追加できます。

Linuxアプリのリモートデバッグのために「C++によるLinux および埋め込み開発」を追加します。

2.プロジェクトの作成(1)

「新しいプロジェクトの作成」画面の上部にある検索ボックスに「Linux」と入力します。

3.プロジェクトの作成(2)

表示された「コンソールアプリ(Linux)」を選択して「次へ」ボタンをクリックします。

プロジェクトの名前を付けて「作成」ボタンをクリックします。

4.ビルド&実行

メニューから[ビルド]-[ソリューションのビルド]を選択します。

「Linux への接続」画面に、デバッグする環境のホスト名(IPアドレスでも可)、ポート、Linuxのユーザー名とパスワードを入力して[接続]ボタンをクリックします。

事前にLinuxにログインできるユーザを作成しておく必要があります。

問題なければ、出力画面に「正常終了」が表示されます。

デバッグ画面

・WindowsからLinux上のアプリをデバッグ可能。
変数も参照可能で、ブレークポイントも有効です。

・printf文で出力した内容が[Linux コンソール ウィンドウ]に出力される。実行はLinux側で行われています。

リモートデバッグの仕組み

Visual Studioを使ったLinuxプラグラムのリモートデバッグの仕組みを簡単に紹介します。

Linux側で以下のようなファイルが作成されます。

接続アカウントのホームディレクトリの下に 「projects」ディレクトリが作成され、プロジェクト名(この画面の場合、”linux-remote-debug”)のディレクトリ下にソースとgccでビルドしたプログラムが作成されます。

デバッグ時はLinux上のデバッガgdbからプログムが起動されます。(画像はtop画面)

Linux上での実行結果が、Windows上のVisual Studioの「Linux コンソール」に表示されます。
余談ですが、Linuxでコンパイルしても実行可能です。(当たり前ですが)
g++でビルドすれば実行できます。

少しハマるところ。エラーやワーニング

以下の環境で実施したときは、エラーやワーニングはでませんでした。

・Microsoft Visual Studio Community 2022 (64 ビット) – Version 17.7.5
・Ubuntu 22.04.3 LTS

古いOSやVisual Studioが古かったりすると発生するようです。

libc.so.pdbは読み込まていません

デバッグ実行の終了時に以下が表示されます。
とりあえず、無視して先に進んでもOKです。

以下で解決する可能性があります。(Ubuntuは実機で未確認です)
・Ubuntu の場合は、 libc6-dbg パッケージをインストール
・CentOSの場合は、「debuginfo-install -y coreutils 」でデバッグ情報をインストール

Unexpected GDB output from command -exec-next

実行時に以下のエラーが表示されます。

細かく調査できていませんが、gccとgdbを最新に更新したら、表示されなくなりました。

gdb-7.6.1-114.el7.x86_64 を gdb-7.6.1-120.el7.x86_64 にアップデート。

Linux コンソールウィンドウに変なwarning

[Linux コンソールウィンドウ]に変なワーニングが出力されます。
アプリのprintf()の出力はコンソールに正しく情報出ているので無視。

——————
[Linux コンソール ウィンドウ]
“warning: GDB: Failed to set controlling terminal: \350\250\261\345\217\257\343\201\225\343\202\214\343\201\246\343\201\204\343\201\252\343\201\204\346\223\215\344\275\234\343\201\247\343\201\231\n”

★ここに printf()の出力が表示されます。

——————

Linuxへの接続に失敗する場合

「Linuxへの接続」でビルドに失敗する場合には、SSHが設定されていない可能性があります。

事前に Tera Term (SSH)などでログインできるか確認しておきましょう。

VisualStudio側の接続設定の場合もあります。

接続マネージャーで確認可能です。

1. Visual Studio のメニューバーで [ツール] – [オプション] を選択して、[オプション]ダイアログを開きます。
その後、[クロス プラットフォーム] – [接続マネージャー] を選択します。

2. [接続マネージャー] ダイアログで、 [編集] ボタンを押して設定内容を確認します。

あとがき

今回は、簡単なプログラムが動作するところまでを紹介しました。
有用なノウハウなど発見したら、追記していく予定です。

Visual Studio 2022 と 2019 を比較! 違いは?Windowsのプログラミングで必要な『Visual Studio 2022』の紹介です。 Visual Studio は、Win...

Visual Studioでデバッグ方法(初心者向け基本)を動画で紹介しています。Visual Studioのデバッグの復習に最適です。