Diesmal Remote Development von Visual Studio Code Ich möchte die Linux-Systemprogrammierung (Sprache C) unter Ubuntu der virtuellen Maschine Azure mit dem Erweiterungspaket ausprobieren. Ich denke.
Ich habe helloworld darauf vorbereitet, es vorerst auszuprobieren. Als ein Formular, das der tatsächlichen Entwicklung nahe kommt, werde ich außerdem versuchen, Remote-Debugging mit nginx als Betreff durchzuführen.
--helloworld Entwicklung und Remote-Debugging
Erstellen Sie eine virtuelle Ubuntu-Maschine. Die Punkte sind wie folgt.
Wie Sie alle über das Erstellen einer virtuellen Maschine wissen, können Sie diese überspringen. Erstellen Sie sie jedoch wie oben beschrieben.
Wählen Sie im Microsoft Azure-Portalbildschirm die Option Ressource erstellen aus, um eine virtuelle Maschine zu erstellen. Wählen Sie Ubuntu Server 18.04 LTS -Gen1 wie unten gezeigt. Nachdem Sie Ihre Auswahl getroffen haben, drücken Sie Überprüfen + Erstellen.
Wenn Sie auf dem Bestätigungsbildschirm auf Erstellen klicken, werden die Schaltflächen Privaten Schlüssel herunterladen und Virtuelle Maschine erstellen angezeigt. Drücken Sie sie erneut. Bitte speichern Sie den privaten Schlüssel, damit Sie ihn nicht verlieren, da Sie ihn für SSH auf dem erstellten Ubuntu benötigen.
Überprüfen Sie nach dem Erstellen der virtuellen Maschine die IP-Adresse des Verbindungsziels auf dem Bildschirm der virtuellen Maschine.
Richten Sie nach der Installation von Visual Studio Code unter Windows 10 die Remoteentwicklung ein. (MacOS ist auch das gleiche, aber dieses Mal ist es erstaunlich, dass die eigentliche Linux-Systemprogrammierung mit diesem Windows durchgeführt werden kann, also werde ich mit Windows 10 fortfahren.)
Laden Sie zunächst Visual Studio Code von der folgenden Site herunter. https://code.visualstudio.com/
Führen Sie das heruntergeladene Installationsprogramm aus, um es zu installieren. Sie werden aufgefordert, eine Aufgabe auszuwählen, die während der Installation hinzugefügt werden soll. Diesmal habe ich sie jedoch wie folgt festgelegt. Auf Ihrem Desktop wird eine Visual Studio-Codeverknüpfung erstellt, die Sie beim Ausführen in diesem Artikel verwenden sollten.
Installieren Sie nach dem Starten von Visual Studio Code die Erweiterungen über das Symbol Erweiterungen links (① in der folgenden Abbildung). Geben Sie den folgenden Nebenstellennamen in das Suchfeld (② in der Abbildung unten) ein, um zu suchen. Wenn die Erweiterung angezeigt wird, drücken Sie Installieren (③ in der folgenden Abbildung), um die Installation abzuschließen.
Name der Erweiterung: Remote Development ms-vscode-remote.vscode-remote-extensionpack https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack
Wenn Remote Development installiert ist, sehen Sie unten links eine grüne Schaltfläche. Klicken Sie darauf.
Wählen Sie über die grüne Schaltfläche unten links "Remote-SSH: Konfigurationsdatei öffnen ..." aus, um das SSH-Verbindungsziel zu registrieren. Setzen Sie HostName auf die öffentliche IP-Adresse der virtuellen Maschine und IdentityFile auf den privaten Schlüssel, der beim Erstellen der virtuellen Maschine heruntergeladen wurde.
.ssh/config
Host linuxsystemprograming-vm
HostName xxx.xxx.xxx.xxx
IdentityFile C:\Users\kentaro\Downloads\linuxsystemprograming-vm_key.pem
User azureuser
Wählen Sie als Nächstes "Remote-SSH: Verbindung zum Host herstellen ..." über die grüne Schaltfläche unten links aus, wählen Sie das zuvor registrierte Verbindungsziel aus und wählen Sie Linux als Plattform für die Verbindung aus. Nachdem Sie bei der Azure Virtual Machine angemeldet sind, installieren Sie die für die Entwicklung erforderlichen Pakete auf der Ubuntu-Seite. Wählen Sie im Menü "Terminal" die Option "Neues Terminal", um das Ubuntu-Terminal für die virtuelle Azure-Maschine anzuzeigen.
Geben Sie im Terminal den folgenden Befehl ein, um gcc und gdb unter Ubuntu auf der Azure Virtual Machine zu installieren.
sudo apt update
sudo apt install -y build-essential gdb
Erstellen Sie im Terminal ein Verzeichnis unter Azure Virtual Machine Ubuntu und erstellen Sie eine Hello World C-Sprachdatei.
cd /home/azureuser/
mkdir helloworld
cd helloworld
touch helloworld.c
Öffnen Sie über das Explore-Symbol oben rechts das Verzeichnis / home / azureuser / helloworld, das Sie gerade erstellt haben.
Wenn Sie helloworld.c auswählen, das in Explore angezeigt wird, wird unten rechts eine Meldung zum Installieren der C / C ++ - Erweiterung angezeigt. Wählen Sie daher Installieren. (Wenn Sie es nicht sehen, installieren Sie die C / C ++ - Erweiterungen über die Erweiterungen auf der linken Seite.)
Ein erneutes Laden ist erforderlich. Laden Sie daher über die Schaltfläche zum erneuten Laden in der Mitte des Bildschirms neu.
Der Quellcode für helloworld.c ist unten.
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;
}
Stellen Sie sicher, dass IntelliSense in Visual Studio Code aktiviert ist.
Speichern Sie es nach der Eingabe mit Ctl -s.
Wählen Sie im Terminal-Menü die Option Standard-Build-Task konfigurieren ... und anschließend C / C ++: gcc build active file.
Da es sich um die Bearbeitung von taks.json handelt, stellen Sie Folgendes ein. (Ich habe nicht geändert, was automatisch erstellt wurde)
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
}
}
]
}
Stellen Sie sicher, dass Sie im Menü "Terminal" über "Build Task ..." ausführen können. Eine ausführbare Datei von helloworld wird erstellt, damit Sie sie ausführen können.
Wählen Sie "Konfiguration hinzufügen ..." aus dem Terminal-Menü, wählen Sie "C ++ (GDB / LLDB)" und wählen Sie "gcc - Aktive Datei erstellen und debuggen", um die Debugging-Methode festzulegen.
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"
}
]
}
Drücken Sie nach Abschluss der Einstellungen bei ausgewähltem Helloworld.c F5 oder wählen Sie "Start Start Debugging" aus dem Menü "Ausführen", um helloworld zu debuggen. Sie können Haltepunkte auch festlegen, indem Sie auf die linke Seite klicken, auf der die Anzahl der Zeilen angezeigt wird. Sie können dann den Wert der Variablen durchlaufen und überprüfen.
Lassen Sie uns als Nächstes Nginx debuggen und ausführen, das unter Ubuntu von Azure Virtual Machine ausgeführt wird.
Hello World ist nicht praktisch, daher möchte ich Visual Studio Code mit nginx als Betreff entwickeln und debuggen.
Laden Sie den Nginx-Quellcode herunter und richten Sie die Nginx-Entwicklungsumgebung ein. Installieren Sie auch die Pakete, die zum Erstellen von nginx erforderlich sind.
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/
Versuchen wir, Nginx für das Debuggen zu erstellen. Stellen Sie sicher, dass Sie fehlerfrei erstellen können.
cd ~/nginx-1.19.2/
./configure --with-cc-opt="-O0" --prefix=`pwd`/nginx
make
Wählen Sie im Menü "Visual Studio-Codedatei" die Option "Ordner öffnen ...", um das Verzeichnis "nginx" (/home/azureuser/nginx-1.19.2) zu öffnen. Ich denke, Sie können IntelliSense verwenden.
Da diese Entwicklung von Azureuser ausgeführt wird, ändern Sie den Listen-Port von Nginx auf 8080 usw. Ändern Sie die Porteinstellung um Zeile 36 in conf / nginx.conf in 8080. (Wenn Sie make install durchführen, ändern Sie auch nginx / conf / nginx.conf.)
Wählen Sie im Terminal-Menü die Option Standard-Build-Task konfigurieren ... und anschließend C / C ++: gcc build active file.
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
}
}
]
}
Stellen Sie sicher, dass Sie im Menü "Terminal" über "Build Task ..." ausführen können. Nach dem Erstellen wird nginx in /home/azureuser/nginx-1.19.2/nginx installiert.
Wählen Sie nach Auswahl von /home/azureuser/nginx-1.19.2/src/core/nginx.c im Menü Terminal die Option "Konfiguration hinzufügen ...", wählen Sie "C ++ (GDB / LLDB)" und anschließend "C ++ (GDB / LLDB)". Wählen Sie gcc --Build und debuggen Sie die aktive Datei, um die Debugging-Methode festzulegen. nginx legt die Option fest, nicht im Daemon ausgeführt zu werden. Außerdem wird stopAtEntry auf true gesetzt, damit es zur Laufzeit schrittweise ausgeführt werden kann.
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"
}
]
}
Stellen Sie vor dem Ausführen des Debugs sicher, dass die eingehende Sicherheitsregel der Azure Virtual Machine Port 8080 zulässt.
Installieren Sie nginx im Terminal und führen Sie es aus.
cd ~/nginx-1.19.2/
make install
./nginx/sbin/nginx -g "daemon off;"
Greifen Sie in Ihrem Webbrowser auf den öffentlichen IP-Adressport 8080 der Azure Virtual Machine zu und überprüfen Sie, ob nginx ausgeführt wird. Beenden Sie nach der Überprüfung mit Ctl -c.
Wenn /home/azureuser/nginx-1.19.2/src/core/nginx.c ausgewählt ist, drücken Sie F5 oder wählen Sie "Start Debugging" aus dem Menü "Ausführen", um Nginx zu debuggen.
Sie können debuggen!
Legen Sie als Test unmittelbar nach dem Warten auf eine Anforderung von einem Webbrowser einen Haltepunkt fest. Es befindet sich in Zeile 802 von /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;
Da dies der Teil ist, der nach dem Start von nginx als Arbeitsprozess (untergeordneter Prozess) ausgeführt wird, stellen Sie ihn so ein, dass er mit gdb an den untergeordneten Prozess angehängt wird, bevor er gegabelt wird. Visual Studio-Code Geben Sie den Befehl gdb unten in DEBUG CONSOLE ein, während Sie das Debug ausführen.
-exec set follow-fork-mode child
Wenn Sie den aktuellen Status überprüfen möchten, lautet dieser wie folgt.
-exec show follow-fork-mode
Sobald Sie auf gdb eingestellt sind, fahren Sie mit "Weiter" (spielerisches Dreieckssymbol) fort. Wenn Sie erneut auf den öffentlichen IP-Adressport 8080 der Azure Virtual Machine zugreifen, befindet sich der Webbrowser in einem Wartezustand. Dies liegt daran, dass es an dem in Visual Studio Code (gdb) festgelegten Haltepunkt stoppt.
Wenn Sie den von epoll_wait zurückgegebenen Wert in Visual Studio Code überprüfen, ist 1 enthalten. Sie können auch Schritt. Toll! (man epoll_wait : https://linuxjm.osdn.jp/html/LDP_man-pages/man2/epoll_wait.2.html)
Wenn Sie den Follow-Fork-Modus vom Beginn des Debuggens an auf child setzen möchten, legen Sie setupCommands wie unten gezeigt fest.
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"
}
]
}
Die Linux-Systemprogrammierung ist mit Visual Studio Code und Azure Virtual Machine vertraut geworden. Es ist wie ein Traum, Linux, das in der Cloud ausgeführt wird, remote debuggen zu können.
Wenn Sie einen Server schreiben möchten, versuchen Sie es bitte.
Übrigens gibt es viele Bücher über die Entwicklung von TCP / UDP-Serverprogrammen, aber es gibt viele Bücher, die Fehler nicht gut behandeln. Daher möchte ich die empfohlenen Bücher für diejenigen vorstellen, die von nun an studieren.
--UNIX Network Programming <Vol.1> W.Richard Stevens (Es ist ein UNIX-Lehrbuch, aber es wird nur verwendet ...) https://amzn.to/335xUel
Wenn Sie den Basiscode von UNIX kennen und mit einer großen Anzahl von Clients auf einem Server unter Linux arbeiten möchten, werden die folgenden Bücher empfohlen.
Ich habe ein bisschen Nginx-Code für diesen Artikel gelesen, aber er ist hübsch, also eine großartige Lernerfahrung.
Na dann.