3.3 Entwicklung am Raspberry Pi
Bei der Software-Entwicklung auf Embedded Devices wie dem Raspberry Pi läuft die Entwicklungsumgebung in der Regel nicht auf dem Gerät selbst, sondern auf dem Arbeitsplatzrechner der Entwicklerin. Dadurch ergeben sich leicht unterschiedliche Anforderungen beim Debugging. Um den Debugger mit dem Gerät zu verbinden, muss eine Netzwerkverbindung mit den entsprechenden Port-Weiterleitungen hergestellt werden. Läuft der Raspberry Pi produktiv dann ohne Internet Zugang, ist ein gutes Logging der Applikation wichtig, um später Fehlern auf die Spur zu kommen.
In den folgenden beiden Abschnitten wollen wir auf diese beiden Themen eingehen.
Step-by-step-Debugging auf einem Raspberry Pi
Beim klassischen Debugging setzt man Breakpoints im Code und führt das Programm mit einem Debugger aus. Sobald die Stelle mit dem Breakpoint erreicht wird, wird die Ausführung angehalten, und man hat die Möglichkeit, den Status der Applikation zu diesem Zeitpunkt zu überprüfen. Außerdem kann man dann schrittweise, also step-by-step, jeden Aufruf verfolgen und den Inhalt von Variablen untersuchen.
Wir haben keine gute Anwendung für KI bei dieser Tätigkeit gefunden. Es bleibt Handarbeit, die Breakpoints zu setzen und den Applikationsstatus zu überprüfen. Wobei uns die KI aber schon unterstützen kann, ist das Setup, damit wir Step-by-step-Debugging überhaupt erst beginnen können. Wir haben eine Python-Anwendung auf einem Raspberry Pi entwickelt, die einen Schrittmotor steuert und über ein integriertes Touch-Display gesteuert wird.
Prompt: What tools do I need to step-by-step debug my Python app on a remote Raspberry Pi?
To step-by-step debug your Python app on a remote Raspberry Pi, you’ll need the following tools:
-
SSH client: To connect to your Raspberry Pi remotely.
-
Remote debugging tool: There are a few options:
-
pdb (Python Debugger): Built-in Python debugger.
-
rpdb: Remote Python Debugger, an extension of pdb.
-
Visual Studio Code with Remote SSH extension: Provides a full IDE experience.
-
-
Code editor: If not using VS Code, you’ll need a way to view and edit your code.
-
Port forwarding: To allow your local machine to connect to the debugger on the Pi.
Here’s a basic setup using rpdb: …
Am Ende der hier nicht mehr abgedruckten Anleitung erwähnt Claude 3.5 Sonnet, dass der Ablauf etwas reibungsloser (a smoother debugging process) verläuft, wenn man VS Code und das Remote-SSH-Plug-in verwendet. Dazu wollen wir noch mehr wissen:
Prompt: How would I do it using VS Code with the Remote SSH extension?
Using Visual Studio Code with the Remote SSH extension is indeed a more user-friendly approach for remote debugging. Here’s how to set it up:
-
Install Visual Studio Code on your local machine.
-
Install the “Remote - SSH” extension in VS Code.
…
Es folgen 12 Schritte, die kurz erklären, wie Sie das Debugging für Python auf dem Raspberry Pi aktivieren. Auch wenn das aufwendig klingt, so kommen Sie doch rasch zu einer funktionierenden Debugging-Lösung.
Hilfe beim Erstellen von Log-Einträgen
Beim Debugging von Geräten, die nicht vor Ort und womöglich auch noch offline sind, ist es eine gute Praxis, wichtige Meldungen in eine Logdatei zu schreiben. So kann man auch zu einem späteren Zeitpunkt Fehler entdecken. Wir arbeiteten an einem Projekt, bei dem man das WLAN von einer Cloud-Plattform aus auf Raspberry Pis konfigurieren kann, die über das Mobilfunknetz verbunden sind. Eine Python-Anwendung auf dem Raspberry Pi macht die entsprechenden Systemaufrufe, um die Einstellungen permanent zu speichern.
Wir versuchten, etwas Unterstützung beim Erstellen der Logging-Informationen von GitHub Copilot zu erhalten:
Prompt: Help me debug this function with some logging information.
def set_wifi_wpa_cli(ssid, psk):
if ssid == '' or psk == '':
return
basecmd = ['sudo', 'wpa_cli', '-iwlan0']
cmd = basecmd + ['list_networks']
subprocess.run(cmd, capture_output=True)
out_str = res.stdout.decode('utf-8')
if re.search(rf"\t{ssid}\t", out_str, re.MULTILINE):
# network already there
else:
cmd = basecmd + ['add_network']
res = subprocess.run(cmd, capture_output=True)
netnr = res.stdout.decode('utf-8')
cmd = basecmd + ['set_network', netnr, 'ssid',
f'"{ssid}"']
res = subprocess.run(cmd, capture_output=True)
cmd = basecmd + ['set_network', netnr, 'psk', f'"{psk}"']
res = subprocess.run(cmd, capture_output=True)
...
To add logging information to the set_wifi_wpa_cli function, you can use Python’s built-in logging module. This will help you trace the execution flow and capture the output of each command.
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s - %(levelname)s - %(message)s')
...
if ssid == '' or psk == '':
logging.warning("SSID or PSK is empty.")
return
...
if re.search(rf"\t{ssid}\t", out_str, re.MULTILINE):
logging.info(f"Network {ssid} already exists.")
else:
cmd = basecmd + ['add_network']
logging.debug(f"Running command: {' '.join(cmd)}")
res = subprocess.run(cmd, capture_output=True)
netnr = res.stdout.decode('utf-8').strip()
logging.debug(f"Network number: {netnr}")
...
Wie Sie in den Ausschnitten der Antwort sehen können (wir haben die Ausgabe hier stark gekürzt), leistet Copilot ganze Arbeit. Zuerst wird das Logging für Python konfiguriert, in einem weiteren Schritt werden die Log-Ausgaben nach ihrer Wichtigkeit gewertet und entsprechend mit info, warning oder debug gekennzeichnet. Das macht es für uns einfacher, die Logdatei später zu filtern. Bei den System-Aufrufen (subprocess.run) werden sowohl das Kommando als auch das Ergebnis gelogged. Außerdem verwendet die KI die relativ moderne Python-Schreibweise für Zeichenketten mit F-Strings.