Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Manchmal untersucht der Entwickler<br />
jedoch Programme, die ohne Betriebssystem<br />
funktionieren, oder er will Fehler<br />
im Betriebssystem selbst aufspüren. Die<br />
Programme im ersten Fall heißen Bare-<br />
Metal-Applikationen, da sie ohne Zwischenschicht<br />
direkt auf der Hardware<br />
laufen. Auch sie lassen sich mit einem<br />
gewissen Mehraufwand über Remote-<br />
Debugging-Techniken erforschen.<br />
Eine Variante besteht darin, spezielle Debug-Routinen<br />
in das zu untersuchende<br />
Programm einzuschleusen. So kann<br />
dieses selbst als Debug-Server arbeiten,<br />
mit dem sich der Debugger des Entwicklungssystems<br />
dann verbindet. Was GDB<br />
betrifft, stehen für einige Architekturen<br />
(mit Ausnahme von beispielsweise ARM)<br />
fertige Bibliotheken bereit, die nur ein<br />
geringfügiges Eingreifen des Programmierers<br />
erfordern. Sobald die Routinen<br />
in dem zu untersuchenden Programm<br />
stecken, kann sich der Debugger auf der<br />
Entwicklungsmaschine über eine serielle<br />
RS232-Verbindung mit dem Zielsystem<br />
verbinden.<br />
Diese Variante des Remote Debugging<br />
lässt sich auch für den <strong>Linux</strong>-Kernel einsetzen,<br />
der unter der Bezeichnung KGDB<br />
bereits Routinen mitbringt, die ihn in einen<br />
GDB-Server verwandeln. Aktiviert<br />
man die passenden KGDB-Optionen (zum<br />
Beispiel »CONFIG_KGDB=y« und »CON-<br />
FIG_KGDB_SERIAL_CONSOLE=y«), lässt<br />
er sich über eine serielle Verbindung wie<br />
jedes andere Bare-Metal-Programm untersuchen.<br />
Debugging via JTAG<br />
Sollte auch die Erweiterung des zu untersuchenden<br />
Programms nicht möglich<br />
oder zu aufwändig sein, lässt sich die<br />
Software im Embedded-Bereich auch mit<br />
Hilfe spezieller Debugging-Schnittstellen<br />
der Hardware genauer untersuchen. Als<br />
JTAG<br />
JTAG steht als Kürzel für Joint Test Action<br />
Group und ist die geläufige Bezeichnung für den<br />
IEEE-Standard 1149.1. Dieser implementierte ursprünglich<br />
lediglich einen Boundary-Scan-Test,<br />
mit dem es möglich ist, Zustände von Flipflops<br />
in einer kompletten Schaltung auszulesen. Obwohl<br />
der Standard in der Zwischenzeit wesentlich<br />
erweitert wurde, bleibt der Boundary-Scan-<br />
Test der wichtigste Bestand teil und der Begriff<br />
Abbildung 2: Um ARM-Programme auf einem<br />
herkömmlichen x86-System zu debuggen, hilft der<br />
Einsatz eines Cross-Debuggers.<br />
Standard hierfür hat sich inzwischen die<br />
JTAG-Schnittstelle etabliert (siehe Kasten<br />
„JTAG“).<br />
Diese ermöglicht es, den Prozessor des<br />
Zielsystems an den zur Laufzeit genutzten<br />
Steuerungsmöglichkeiten vorbei zu<br />
dirigieren. Der Entwickler kann ihn anhalten,<br />
die instruktionsweise Ausführung<br />
eines Programms erzwingen, aber<br />
auch die Register- und Speicherinhalte<br />
auslesen und manipulieren. Die JTAG-<br />
Kette akzeptiert sogar mehrere Geräte,<br />
wodurch sich auch Koprozessoren, zum<br />
Beispiel digitale Signalprozessoren, ansteuern<br />
lassen.<br />
Wer auf die JTAG-Schnittstelle zugreifen<br />
möchte, benötigt einen Adapter, den<br />
es für die ARM-Plattformen bereits ab<br />
zirka 25 Euro gibt und den man per USB-<br />
wird von manchen Entwicklern als Synonym für<br />
JTAG verwendet.<br />
Neben dem Auslesen von Flipflops lassen sich<br />
mit JTAG inzwischen auch eingebettete Schaltungen<br />
wie Microcontroller, System-on-Chips<br />
und Field Programmable Gate Arrays (FPGA)<br />
steuern und überwachen. Er basiert auf einem<br />
seriellen Protokoll, welches das entsprechende<br />
Gerät über einen Zustandsautomaten steuert.<br />
oder RS232-Schnittstelle mit dem Entwicklungsrechner<br />
verbindet. Die Nutzer<br />
der Schnittstelle gehen dann nach dem<br />
Schema des Remote-Debugging (Abbildung<br />
3) vor. Dabei stellt der JTAG-Debug-Server<br />
eine Brücke zwischen JTAG-<br />
Schnittstelle und Debugger auf dem Entwicklungssystem<br />
her.<br />
Für den Debugger erscheint die JTAG-<br />
Schnittstelle nun wie ein Remote-Server.<br />
Letzterer übersetzt die Kommandos des<br />
Debuggers (beispielsweise zum Anhalten<br />
der Software oder zum Auslesen von<br />
Registern) in den entsprechenden JTAG-<br />
Befehlsstrom und wandelt die über JTAG<br />
ausgelesenen Werte in ein für den Debugger<br />
verständliches Format. Das erfordert<br />
keine Anpassungen an dem zu untersuchenden<br />
Programm, da die Eingriffe nur<br />
Hardware-seitig stattfinden.<br />
JTAG erweist sich also als sehr bequeme<br />
Möglichkeit zum nicht-invasiven Debugging,<br />
wenn das Zielsystem die entsprechende<br />
Schnittstelle mitbringt. Das ist<br />
jedoch nur bei speziellen Entwicklungsboards<br />
der Fall, während den davon abgeleiteten<br />
Endprodukte diese Schnittstelle<br />
in der Regel aus Kostengründen fehlt. Bei<br />
anderen Geräten sind sie auf der Leiterplatte<br />
vorgesehen, aber nicht bestückt,<br />
sodass sich für Bastler und Hacker interessante<br />
Möglichkeiten [2] ergeben.<br />
Fehlersuche per Emulation<br />
Eine weitere einfache Möglichkeit, um<br />
Fehler in Programmen von eingebetteten<br />
Systemen aufzuspüren, besteht im<br />
Emulieren der Zielplattform. Die Granularität<br />
kann dabei höchst unterschiedlich<br />
sein und reicht von der Emulation<br />
eines API über die Systememulation bis<br />
hin zur vollständigen Simulation. Ein<br />
Anwendungsbeispiel wäre die erwähnte<br />
Entwicklungsumgebung von Google für<br />
Android.<br />
Eine universellere Form der Fehlersuche<br />
per Remote Debugging erlaubt die freie<br />
virtuelle Maschine Qemu. Sie emuliert<br />
komplette Systeme, führt also auch Bare-<br />
Metal-Programme ohne spezielle Anpassung<br />
aus. Sie stellt jedoch zusätzlich eine<br />
GDB-Server-Schnittstelle bereit, die eine<br />
ähnlich umfangreiche Steuerung erlaubt<br />
wie eine JTAG-Schnittstelle und dabei<br />
hilft, die Programmausführung zu manipulieren<br />
und zu untersuchen. Analog zu<br />
Embedded Debugging 09/2013<br />
Know-how<br />
www.linux-magazin.de<br />
87