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
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.
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.
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éé.
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.
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)
Tout d'abord, téléchargez Visual Studio Code à partir du site suivant. https://code.visualstudio.com/
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.
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
Lorsque Remote Development est installé, vous verrez un bouton vert en bas à gauche, cliquez dessus.
À 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.
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
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.
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)
Un rechargement est nécessaire, veuillez donc recharger à partir du bouton de rechargement au centre de l'écran.
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.
Après avoir entré, enregistrez-le avec Ctl -s.
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.
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.
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.
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"
}
]
}
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.
Ensuite, débogageons et exécutons nginx en cours d'exécution sur Ubuntu de la machine virtuelle Azure.
Hello World n'est pas pratique, je voudrais donc développer et déboguer avec Visual Studio Code en utilisant nginx comme sujet.
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
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)
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.
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"
}
]
}
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.
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.
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.
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;
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
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).
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)
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"
}
]
}
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