26.02.2014 Aufrufe

Linux-Magazin Clean Linux (Vorschau)

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!