Visual Studioで、Linuxのアプリ(プログラム)をWindowsからリモートでデバッグする方法を紹介します。
Linuxの標準のデバッガのgdbを使うのは結構難しいので、LinuxのC/C++プログラミング初心者はVisual Studioでデバッグしてもいいかも知れませんね。
gdbもキー操作だけでデバッグできるので便利ですが、最初に学ぶには少しハードルが高いです。
Visual Studioのインストールや基本的な操作は以下の記事を参照ください。
この記事の動画を作成しています。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でデバッグ方法(初心者向け基本)を動画で紹介しています。Visual Studioのデバッグの復習に最適です。