Probieren wir die Linux-Systemprogrammierung mit Visual Studio Code und Azure aus! (Von helloworld über Nginx-Entwicklung bis hin zu Remote-Debugging)

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

1. Bereiten Sie die virtuelle Ubuntu-Maschine unter Microsoft Azure vor

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.

1.1. Erstellen Sie eine virtuelle Ubuntu-Maschine

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.

image.png

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.

image.png

Überprüfen Sie nach dem Erstellen der virtuellen Maschine die IP-Adresse des Verbindungsziels auf dem Bildschirm der virtuellen Maschine.

2. Bereiten Sie den Visual Studio-Code vor

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.)

2.1. Installieren Sie Visual Studio Code

Laden Sie zunächst Visual Studio Code von der folgenden Site herunter. https://code.visualstudio.com/

image.png

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.

image.png

2.2 Installieren Sie die für die Remoteentwicklung erforderlichen Erweiterungen in Visual Studio Code

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

image.png

Wenn Remote Development installiert ist, sehen Sie unten links eine grüne Schaltfläche. Klicken Sie darauf.

image.png

2.3. SSH zu Azure Virtual Machine

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.

image.png

3. Bereiten Sie die Ubuntu-Entwicklungsumgebung für Azure Virtual Machine vor

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

4. Machen wir Hello World

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.

image.png

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.)

image.png

Ein erneutes Laden ist erforderlich. Laden Sie daher über die Schaltfläche zum erneuten Laden in der Mitte des Bildschirms neu.

image.png

4.1. Schreiben Sie helloworld.c in IntelliSense

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.

image.png

Speichern Sie es nach der Eingabe mit Ctl -s.

4.2 Legen Sie fest, wie helloworld.c erstellt werden soll

Wählen Sie im Terminal-Menü die Option Standard-Build-Task konfigurieren ... und anschließend C / C ++: gcc build active file.

image.png

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.

image.png

4.3. Legen Sie fest, wie helloworld.c debuggt werden soll

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.

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. Debuggen von helloworld.c aus der Ferne

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.

image.png

Lassen Sie uns als Nächstes Nginx debuggen und ausführen, das unter Ubuntu von Azure Virtual Machine ausgeführt wird.

5. Erstellen und debuggen Sie Nginx mit Visual Studio Code

Hello World ist nicht praktisch, daher möchte ich Visual Studio Code mit nginx als Betreff entwickeln und debuggen.

5.1. Laden Sie nginx herunter und installieren Sie die erforderlichen Pakete

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

5.2. Überprüfen Sie den Nginx-Code mit Visual Studio Code

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.)

image.png

5.3 Legen Sie fest, wie Nginx erstellt werden soll

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.

5.4 Legen Sie fest, wie Nginx debuggt werden soll

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"
        }
    ]
}

5.5. Überprüfen Sie die Funktion von Nginx

Stellen Sie vor dem Ausführen des Debugs sicher, dass die eingehende Sicherheitsregel der Azure Virtual Machine Port 8080 zulässt. image.png

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.

image.png

5.6. Remote-Debuggen von Nginx

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.

image.png

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;

image.png

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

image.png

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.

image.png

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)

image.png

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"
        }
    ]
}

6. Schließlich

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.

Recommended Posts

Probieren wir die Linux-Systemprogrammierung mit Visual Studio Code und Azure aus! (Von helloworld über Nginx-Entwicklung bis hin zu Remote-Debugging)
Remote-Debugging mit Visual Studio 2017
Remote-Debugging in Visual Studio (Linux)
Cross-Compilieren von Raspberry Pi und Erstellen einer Remote-Debug-Entwicklungsumgebung mit VS Code
Führen Sie VS Code und Remote Development in die Offline-Umgebung ein, um die Linux-Entwicklung komfortabel zu gestalten
Erstellen Sie eine Python-Entwicklungsumgebung mit Visual Studio Code
Probleme und Lösungen für die Verwendung der Remote-Debugging-Umgebung für Linux-Apps in Visual Studio 2017
App-Entwicklung zum Twittern in Python aus Visual Studio 2017
Python-Entwicklungsumgebung mit Windows + Anaconda3 + Visual Studio Code
Python-Entwicklungsumgebung mit Windows + Python + PipEnv + Visual Studio-Code
Richten Sie eine Python-Entwicklungsumgebung mit Visual Studio Code ein
[Linux] Komprimieren Sie Ordner und übertragen Sie Dateien von Remote zu Local
Erstellen Sie mit Pybind11 eine Umgebung zum Ausführen von C ++ - Funktionen aus Python (für Benutzer von Windows- und Visual Studio-Code).