Essayons la programmation système Linux avec Visual Studio Code et Azure! (De helloworld au développement nginx et au débogage à distance)

Cette fois, Développement à distance de Visual Studio Code Je veux essayer la programmation système Linux (langage C) sur la fonction Ubuntu de la machine virtuelle Azure à l'aide de la fonction d'extensionpack). Je pense.

J'ai préparé helloworld à l'essayer pour le moment. Aussi, en tant que forme proche du développement réel, je vais essayer le débogage à distance en utilisant nginx comme sujet.

--helloworld développement et débogage à distance --Développement et débogage à distance de nginx

1. Préparez la machine virtuelle Ubuntu sur Microsoft Azure

Créez une machine virtuelle Ubuntu. Les points sont les suivants.

Comme vous le savez tous sur la création d'une machine virtuelle, vous pouvez l'ignorer, mais veuillez la créer conformément à ce qui précède.

1.1. Créer une machine virtuelle Ubuntu

Dans l'écran du portail Microsoft Azure, sélectionnez Créer une ressource pour créer une machine virtuelle. Sélectionnez Ubuntu Server 18.04 LTS -Gen1 comme indiqué ci-dessous. Après avoir fait votre sélection, appuyez sur Revoir + Créer.

image.png

Lorsque vous appuyez sur Créer sur l'écran de confirmation, les boutons Télécharger la clé privée et Créer une machine virtuelle s'affichent. Appuyez de nouveau dessus. Veuillez enregistrer la clé privée afin de ne pas la perdre, car vous en aurez besoin pour SSH sur l'Ubuntu créé.

image.png

Une fois la machine virtuelle créée, vérifiez l'adresse IP de la destination de connexion à partir de l'écran de la machine virtuelle.

2. Préparez le code Visual Studio

Après avoir installé Visual Studio Code sur Windows 10, configurez le développement à distance. (MacOS est également le même, mais cette fois, il est étonnant que la programmation du système Linux puisse être effectuée avec ce Windows, donc je vais continuer avec Windows 10)

2.1. Installer Visual Studio Code

Tout d'abord, téléchargez Visual Studio Code à partir du site suivant. https://code.visualstudio.com/

image.png

Exécutez le programme d'installation téléchargé pour l'installer. Il vous sera demandé de sélectionner une tâche à ajouter lors de l'installation, mais cette fois, je l'ai définie comme suit. Un raccourci Visual Studio Code sera créé sur votre bureau, que vous devez utiliser lors de son exécution dans cet article.

image.png

2.2. Installez les extensions requises pour le développement à distance dans Visual Studio Code

Après avoir démarré Visual Studio Code, installez les extensions à partir de l'icône Extensions sur la gauche (① dans la figure ci-dessous). Entrez le nom d'extension suivant dans la zone de recherche (② dans la figure ci-dessous) pour rechercher. Lorsque l'extension est affichée, appuyez sur Installer (③ dans la figure ci-dessous) pour terminer l'installation.

Nom de l'extension: Développement à distance ms-vscode-remote.vscode-remote-extensionpack https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack

image.png

Lorsque Remote Development est installé, vous verrez un bouton vert en bas à gauche, cliquez dessus.

image.png

2.3. SSH sur la machine virtuelle Azure

À partir du bouton vert en bas à gauche, sélectionnez «Remote-SSH: Open Configuration File ...» pour enregistrer la destination de la connexion ssh. Définissez HostName sur l'adresse IP publique de la machine virtuelle et IdentityFile sur la clé privée téléchargée lors de la création de la machine virtuelle.

.ssh/config


Host linuxsystemprograming-vm
  HostName xxx.xxx.xxx.xxx
  IdentityFile C:\Users\kentaro\Downloads\linuxsystemprograming-vm_key.pem
  User azureuser

Ensuite, sélectionnez "Remote-SSH: Connect to Host ..." à partir du bouton vert en bas à gauche, sélectionnez la destination de connexion que vous avez enregistrée précédemment et sélectionnez Linux comme plate-forme de connexion. Maintenant que vous êtes connecté à la machine virtuelle Azure, installez les packages requis pour le développement du côté Ubuntu. Sélectionnez Nouveau terminal dans le menu Terminal pour afficher le terminal Ubuntu de la machine virtuelle Azure.

image.png

3. Préparez l'environnement de développement Ubuntu pour la machine virtuelle Azure

Dans Terminal, tapez la commande suivante pour installer gcc et gdb sur Ubuntu sur la machine virtuelle Azure.

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

4. Faisons de Hello World

Depuis Terminal, créez un répertoire sur Azure Virtual Machine Ubuntu et créez un fichier de langage Hello World C.

cd /home/azureuser/
mkdir helloworld
cd helloworld
touch helloworld.c

Depuis l'icône Explorer en haut à droite, ouvrez le répertoire / home / azureuser / helloworld que vous venez de créer.

image.png

Lorsque vous sélectionnez helloworld.c affiché dans Explorer, un message pour installer l'extension C / C ++ s'affiche en bas à droite, alors sélectionnez installer. (Si vous ne le voyez pas, installez les extensions C / C ++ à partir des extensions sur la gauche)

image.png

Un rechargement est nécessaire, veuillez donc recharger à partir du bouton de rechargement au centre de l'écran.

image.png

4.1. Ecrire helloworld.c dans IntelliSense

Le code source de helloworld.c est ci-dessous.

helloworld.c


#include <stdio.h>

int main(int argc, char *argv[])
{
    int i;
    for (i = 3; i > 0; i--)
    {
        printf("%d...\n", i);
    }
    printf("Hello World!\n");
    return 0;
}

Assurez-vous qu'IntelliSense est activé dans Visual Studio Code.

image.png

Après avoir entré, enregistrez-le avec Ctl -s.

4.2. Définissez comment construire helloworld.c

Sélectionnez Configurer la tâche de construction par défaut ... dans le menu Terminal, puis sélectionnez C / C ++: fichier actif de construction gcc.

image.png

Puisqu'il va éditer taks.json, définissez comme suit. (Je n'ai pas changé ce qui a été créé automatiquement)

task.json


{
	"version": "2.0.0",
	"tasks": [
		{
			"type": "shell",
			"label": "C/C++: gcc build active file",
			"command": "/usr/bin/gcc",
			"args": [
				"-g",
				"${file}",
				"-o",
				"${fileDirname}/${fileBasenameNoExtension}"
			],
			"options": {
				"cwd": "${workspaceFolder}"
			},
			"problemMatcher": [
				"$gcc"
			],
			"group": {
				"kind": "build",
				"isDefault": true
			}
		}
	]
}

Assurez-vous que vous pouvez créer à partir de "Exécuter la tâche de génération ..." dans le menu Terminal. Un fichier exécutable helloworld sera créé pour que vous puissiez l'exécuter.

image.png

4.3. Définissez comment déboguer helloworld.c

Sélectionnez "Ajouter une configuration ..." dans le menu Terminal, sélectionnez "C ++ (GDB / LLDB)" et sélectionnez "gcc - Construire et déboguer le fichier actif" pour définir la méthode de débogage.

image.png

launch.json


{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "gcc - Build and debug active file",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "C/C++: gcc build active file",
            "miDebuggerPath": "/usr/bin/gdb"
        }
    ]
}

4.4. Déboguer à distance helloworld.c

Après avoir terminé les paramètres, avec Helloworld.c sélectionné, appuyez sur F5 ou sélectionnez "Démarrer le débogage" dans le menu Exécuter pour déboguer helloworld. Vous pouvez également définir des points d'arrêt en cliquant sur le côté gauche où le nombre de lignes est affiché, vous pourrez parcourir et vérifier la valeur de la variable.

image.png

Ensuite, débogageons et exécutons nginx en cours d'exécution sur Ubuntu de la machine virtuelle Azure.

5. Construisez et déboguez nginx avec Visual Studio Code

Hello World n'est pas pratique, je voudrais donc développer et déboguer avec Visual Studio Code en utilisant nginx comme sujet.

5.1. Téléchargez nginx et installez les packages requis

Téléchargez le code source nginx et configurez l'environnement de développement nginx. Installez également les packages requis pour construire nginx.

sudo apt install -y libpcre3-dev libz-dev
cd ~/
wget https://nginx.org/download/nginx-1.19.2.tar.gz
tar xvfz nginx-1.19.2.tar.gz
cd nginx-1.19.2/

Essayons de construire nginx pour le débogage. Assurez-vous que vous pouvez construire sans erreurs.

cd ~/nginx-1.19.2/
./configure --with-cc-opt="-O0" --prefix=`pwd`/nginx
make

5.2. Vérifiez le code nginx avec Visual Studio Code

Sélectionnez "Ouvrir le dossier ..." dans le menu Fichier de code Visual Studio pour ouvrir le répertoire nginx (/home/azureuser/nginx-1.19.2). Je pense que vous pouvez utiliser IntelliSense.

De plus, puisque ce développement sera effectué par azureuser, changez le port d'écoute de nginx en 8080 etc. Modifiez le paramètre de port autour de la ligne 36 dans conf / nginx.conf en 8080. (Si vous effectuez une installation, modifiez également nginx / conf / nginx.conf)

image.png

5.3. Définir comment construire nginx

Sélectionnez Configurer la tâche de construction par défaut ... dans le menu Terminal, puis sélectionnez C / C ++: fichier actif de construction gcc.

task.json


{
	"version": "2.0.0",
	"tasks": [
		{
			"type": "shell",
			"label": "C/C++: gcc build active file",
			"command": "/usr/bin/make",
			"args": [			
				"install"
			],
			"options": {
				"cwd": "${workspaceFolder}"
			},
			"problemMatcher": [
				"$gcc"
			],
			"group": {
				"kind": "build",
				"isDefault": true
			}
		}
	]
}

Assurez-vous que vous pouvez créer à partir de "Exécuter la tâche de génération ..." dans le menu Terminal. Après la construction, nginx sera installé dans /home/azureuser/nginx-1.19.2/nginx.

5.4. Définir comment déboguer nginx

Après avoir sélectionné /home/azureuser/nginx-1.19.2/src/core/nginx.c, sélectionnez "Ajouter une configuration ..." dans le menu Terminal, sélectionnez "C ++ (GDB / LLDB)", puis sélectionnez "C ++ (GDB / LLDB)". Sélectionnez gcc --Build et déboguez le fichier actif pour définir la méthode de débogage. nginx définit l'option de ne pas s'exécuter dans le démon. En outre, stopAtEntry est défini sur true afin qu'il puisse être progressé au moment de l'exécution.

launch.json


{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "gcc - Build and debug active file",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/nginx/sbin/nginx",
            "args": ["-g", "daemon off;"],
            "stopAtEntry": true,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "C/C++: gcc build active file",
            "miDebuggerPath": "/usr/bin/gdb"
        }
    ]
}

5.5. Vérifier le fonctionnement de nginx

Avant d'exécuter le débogage, assurez-vous que la règle de sécurité entrante de la machine virtuelle Azure autorise le port 8080. image.png

Depuis Terminal, installez et exécutez nginx.

cd ~/nginx-1.19.2/
make install
./nginx/sbin/nginx -g "daemon off;"

Dans votre navigateur Web, accédez au port d'adresse IP publique 8080 de la machine virtuelle Azure et vérifiez que nginx est en cours d'exécution. Après vérification, quittez avec Ctl -c.

image.png

5.6. Déboguer à distance nginx

Avec /home/azureuser/nginx-1.19.2/src/core/nginx.c sélectionné, appuyez sur F5 ou sélectionnez "Démarrer le débogage" dans le menu Exécuter pour déboguer nginx.

image.png

Vous pouvez déboguer!

À titre de test, définissez un point d'arrêt immédiatement après avoir attendu une demande d'un navigateur Web. C'est autour de la ligne 802 de /home/azureuser/nginx-1.19.2/src/event/modules/ngx_epoll_module.c.

800:    events = epoll_wait(ep, event_list, (int) nevents, timer);
801:
802:    err = (events == -1) ? ngx_errno : 0;

image.png

Comme il s'agit de la partie qui s'exécute en tant que processus de travail (processus enfant) après le démarrage de nginx, définissez-la pour qu'elle s'attache au processus enfant avec gdb avant qu'il ne soit forké. Code Visual Studio Entrez la commande gdb en bas de DEBUG CONSOLE lors de l'exécution du débogage.

-exec set follow-fork-mode child

image.png

De plus, si vous souhaitez vérifier l'état actuel, ce sera comme suit.

-exec show follow-fork-mode

Une fois défini sur gdb, continuez à courir avec "Continuer" (icône de triangle en forme de lecture). Lorsque vous accédez à nouveau au port 8080 de l'adresse IP publique de la machine virtuelle Azure, le navigateur Web sera en état d'attente. Cela est dû au fait qu'il s'arrête au point d'arrêt défini dans Visual Studio Code (gdb).

image.png

Si vous vérifiez la valeur renvoyée par epoll_wait dans Visual Studio Code, 1 est inclus. Vous pouvez également faire un pas. Génial! (man epoll_wait : https://linuxjm.osdn.jp/html/LDP_man-pages/man2/epoll_wait.2.html)

image.png

De plus, si vous souhaitez définir le mode follow-fork sur child depuis le début du débogage, définissez setupCommands comme indiqué ci-dessous.

launch.json


{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "gcc - Build and debug active file",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/nginx/sbin/nginx",
            "args": ["-g", "daemon off;"],
            "stopAtEntry": true,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "Set follow-fork-mode to child",
                    "text": "set follow-fork-mode child",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "C/C++: gcc build active file",
            "miDebuggerPath": "/usr/bin/gdb"
        }
    ]
}

6. Enfin

La programmation système Linux est devenue plus familière avec Visual Studio Code et Azure Virtual Machine. C'est comme un rêve de pouvoir déboguer à distance Linux fonctionnant dans le cloud.

Si vous souhaitez écrire un serveur, essayez-le.

À propos, il existe de nombreux livres sur le développement de programmes de serveur TCP / UDP, mais il existe de nombreux livres qui ne gèrent pas bien les erreurs, je voudrais donc vous présenter les livres recommandés pour ceux qui étudient désormais.

--UNIX Network Programming <Vol.1> W.Richard Stevens (C'est un manuel UNIX, mais il n'est utilisé que ...) https://amzn.to/335xUel

Si vous connaissez le code de base d'UNIX et souhaitez gérer un grand nombre de clients sur un serveur sous Linux, les livres suivants sont recommandés.

J'ai lu un peu le code nginx pour cet article, mais c'est joli, donc c'est une excellente expérience d'apprentissage.

Eh bien.

Recommended Posts

Essayons la programmation système Linux avec Visual Studio Code et Azure! (De helloworld au développement nginx et au débogage à distance)
Débogage à distance avec Visual Studio 2017
Débogage à distance dans Visual Studio (Linux)
Compilation croisée de Raspberry Pi et création d'un environnement de développement de débogage à distance avec VS Code
Introduisez VS Code et le développement à distance dans un environnement hors ligne pour rendre le développement Linux confortable
Créer un environnement de développement Python avec Visual Studio Code
Problèmes et solutions pour l'utilisation de l'environnement de débogage distant pour les applications Linux dans Visual Studio 2017
Développement d'applications pour tweeter en Python à partir de Visual Studio 2017
Environnement de développement Python avec Windows + Anaconda3 + Visual Studio Code
Environnement de développement Python avec Windows + Python + PipEnv + Visual Studio Code
Configurer un environnement de développement Python avec Visual Studio Code
[Linux] Compresser les dossiers et transférer des fichiers de la télécommande vers le local
Créer un environnement pour exécuter des fonctions C ++ à partir de Python avec Pybind11 (pour les utilisateurs de Windows et Visual Studio Code)