Remote-Debugging von Applikationen mit Visual Studio Code (VSC)
Dieser Abschnitt beschreibt, wie Sie Ihre auf Windows basierende Entwicklungsumgebung nutzen können, um Applikationen auf TwinCAT/BSD-Zielsystemen zu kompilieren und zu debuggen.
Die Grundidee ist, dass Sie Ihren gesamten Quellcode auf dem Windows-Entwicklungsrechner aufbewahren. Die Bearbeitung des Quellcodes erfolgt unter Windows und auch das Debugging-Frontend läuft auf Ihrem normalen Windows-Entwicklungsrechner. Zum Kompilieren und Debuggen auf TwinCAT/BSD wird eine SSH-Verbindung verwendet. Dieser Prozess kann in folgende Schritte aufgeteilt werden:
- Synchronisieren Sie den Quellcode über SSH mit Hilfe von
rsync
vom Windows-Entwicklungsrechner zum TwinCAT/BSD-Zielsystem. - Kompilieren Sie die Applikation über eine SSH-Verbindung auf dem Zielsystem.
- Debuggen Sie mit Hilfe von VSC über eine SSH-Verbindung zu
gdb
, das auf dem Zielsystem läuft.
Voraussetzungen:
- Stellen Sie sicher, dass folgende Pakete installiert sind:
- llvm
- os-generic-userland-devtools
- gdb
- rsync
- lnstallieren Sie OpenSSH für Windows: https://learn.microsoft.com/en-us/windows-server/administration/openssh/openssh_install_firstuse
- Erstellen Sie einen Benutzerschlüssel für den Entwicklungsrechner. Wir empfehlen den Algorithmus ed25519 (ssh-keygen -t ed25519) https://learn.microsoft.com/en-us/windows-server/administration/openssh/openssh_keymanagement#user-key-generation
- Kopieren Sie den öffentlichen Schlüssel mit Hilfe der Powershell auf Ihr Zielsystem:
(Get-Content -Encoding UTF8 $home\.ssh\id_ed25519.pub).Replace("`r`n", "`n") | ssh Administrator@172.17.66.111 'cat >> ~/.ssh/authorized_keys'
- Installieren Sie die Remote-Debugging-Erweiterung VSC auf Ihrem Entwicklungsrechner:
(CTRL+p) ext install ms-vscode.cpptools
- Installieren Sie
cwrsync
unter C:\Program Files\cwrsync auf Ihrem Entwicklungsrechner. Diese Software ist eine rsync-Implementierung für Windows und ist beispielsweise erhältlich unter: https://www.itefix.net/cwrsync
VSC-Einstellungen:
Jetzt sind cwrsync
und ssh
verfügbar, und Sie können VSC weiter für das Remote-Debugging einrichten.
- 1. Beginnen Sie mit der Synchronisierung des Quellcodes. Vergewissern Sie sich, dass Sie einen Ordner
.vscode
in Ihrem Projektverzeichnis haben. Wählen Sie dann aus dem VSC-Menü:
Terminal->Configure Tasks...->Create tasks.json from template->Others
- 2. Passen Sie die folgende Vorlage entsprechend Ihrer Konfiguration an, um eine Task wie
syn-src-to-remote
zu erhalten.
{
"version": "2.0.0",
"windows": {
"options": {
"shell": {
"executable": "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
"args": [
"-NoProfile",
"-ExecutionPolicy",
"Bypass",
"-Command"
]
}
}
},
"tasks": [
{
"label": "sync-src-to-remote",
"type": "shell",
"args": [
"-aP",
"--exclude",
".git",
"--exclude",
"This folder should be ignored",
"-e", "c:/''Program Files''/cwrsync/bin/ssh.exe -i ${userHome}/.ssh/id_ed25519 -o ''StrictHostKeyChecking no''",
".",
"Administrator@172.17.66.111:~/${workspaceFolderBasename}/"
],
"command": "c:/Program Files/cwrsync/bin/rsync.exe",
"problemMatcher": []
}
]
}
- 3. Sie können die neue Task wie folgt testen:
Menu->Terminal->Run Task->sync-src-to-remote
- 4. Jetzt sollten Sie etwas im Terminal-Ausgabefenster sehen und die Quelldateien sollten auf Ihrem Zielsystem erscheinen. Wenn Sie "Permission denied"-Fehler sehen, versuchen Sie diese zusätzlichen rsync-Argumente:
"--chmod=u=rwX --chmod=go=rX"
- 5. Wenn Sie einen anderen SSH-Port verwenden, fügen Sie ihn mit
-p <Port>
hinzu:
"c:/''Program Files''/cwrsync/bin/ssh.exe -p 22222 -i ${userHome}/.ssh/id_ed25519 -o ''StrictHostKeyChecking no''"
- 6. Der nächste Schritt besteht darin, Ihre Applikation remote auf Ihrem Zielsystem zu erstellen. Fügen Sie eine weitere Task
build-on-remote
zu Ihrer tasks.json hinzu.
{
"version": "2.0.0",
"windows": {
"options": {
"shell": {
"executable": "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
"args": [
"-NoProfile",
"-ExecutionPolicy",
"Bypass",
"-Command"
]
}
}
},
"tasks": [
{
"label": "sync-src-to-remote",
"type": "shell",
"args": [
"-aP",
"--exclude",
".git",
"--exclude",
"This folder should be ignored",
"-e", "c:/''Program Files''/cwrsync/bin/ssh.exe -i ${userHome}/.ssh/id_ed25519 -o ''StrictHostKeyChecking no''",
".",
"Administrator@172.17.66.111:~/${workspaceFolderBasename}/"
],
"command": "c:/Program Files/cwrsync/bin/rsync.exe",
"problemMatcher": []
},
{
"dependsOn":"sync-src-to-remote" ,
"label": "build-on-remote",
"group" : "build",
"type" : "shell",
"args": [
"Administrator@172.17.66.111",
"cd ${workspaceFolderBasename}; clang++ -g -Wall -pedantic main.cpp -o main. bin"
],
"command": "ssh",
"problemMatcher": []
}
]
}
- 7. Dieses Mal können Sie
STRG+SHIFT+B
verwenden, um die neuebuild-on-remote
Task auszuführen, da wir sie der Gruppebuild
hinzugefügt haben. - 8. Fügen Sie eine Startkonfiguration hinzu, um Ihre Applikation remote zu debuggen. Wählen Sie im Menü:
Run->Add configuration
- 9. Bearbeiten Sie die launch.json Vorlage so, dass sie Ihren eigenen Anforderungen entspricht:
{
"version": "0.2.0",
"configurations": [
{
"name": "debug-on-remote",
"type": "cppdbg",
"request": "launch",
"cwd": "/home/Administrator/${workspaceFolderBasename}",
"preLaunchTask": "build-on-remote",
"program": "main",
"stopAtEntry": false,
"externalConsole": false,
"sourceFileMap": {
"/home/Administrator/${workspaceFolderBasename}": "${workspaceFolder}"
},
"pipeTransport": {
"debuggerPath": "/usr/bin/gdb",
"pipeProgram": "ssh",
"pipeArgs": [
"Administrator@172.17.66.111"
]
},
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
- 10. Passen Sie ein paar Parameter an Ihre Anforderungen an:
program: should be the binary on your remote machine you want to debug
pipeTransport->pipeArgs :username and ip address for your remote machine
Jetzt haben Sie eine launch.json Datei. Mit F5 wird ein Debugger ausgeführt, der mit Ihrem Programm auf dem Zielrechner verbunden ist.
Stellen Sie sicher, dass Sie mit aktivierten Debugsymbolen kompilieren ("-g").