Open Source im professionellen Einsatz

Newsletter abonnieren
Seite durchsuchen

HEFTARCHIV | NEWS | E-BIBLIOTHEK | VIDEO | BLOGS | WHITEPAPER | EVENTS | ACADEMY | ABO | SHOP

user friendly

  Home  »  Heft & Abo  »  Heftarchiv  »  2005  »  04  »  Auf der Pirsch  

RSS-Feed der aktuellen News von Linux-Magazin Online Folgen Sie Linux-Magazin Online auf Twitter
Diesen Artikel druckenDiesen Artikel weiterempfehlen Diesen Artikel kommentieren Newsletter abonnieren
Share/Bookmark

Symbol-Informationen

Der Einsatz von GDB setzt voraus, dass der GCC dem Programm einige Informationen hinzufügt. Diese so genannten Symbol-Informationen beschreiben unter anderem, wo die Funktionen und Variablen im Speicher liegen, und ermöglichen es dem Debugger damit, Detailinformationen über ein Programm zu liefern. Um Symbol-Informationen aufzunehmen, kompilieren Sie das betreffende Programm mit GCC neu, setzen aber beim Aufruf zusätzlich die Compiler-Option »-g«:

$ gcc -g -Wall -O3 change.c -o change

Listing 1: Einfaches
Wechselgeldprogramm

01  #include <stdio.h>
02  #include <stdlib.h>
03
04  void CalcChangeFor(int cent)
05  {
06  int i, val;
07  int coins[] = { 200,100,50,20,10,5,2,1,};
08
09  if (cent == 0)
10    return; /* genauer Betrag */
11  if (cent < 0)
12    return; /* ungültiger Betrag */
13
14  for(i=0;i<7;i++) {   /* für jede Münze */
15    val = coins[i];
16    for(i=cent;i>0;i++)
17      if (val*i <= cent)
18        printf("%d x %dcn", i, val);
19        CalcChangeFor(cent - i*val);
20        return;
21      }
22    }
23
24  void usage(void)
25  {
26    fprintf(stderr, "Eingabe: change <amount>n");
27  }
28
29  int main(int argc, char **argv)
30  {
31    if (argc > 1)
32      CalcChangeFor(atoi(argv[1]));
33    else
34      usage();
35    return 0;
36  }

Start nach Wahl

Es gibt verschiedene Möglichkeiten zum Start von GDB. Sie können einen Programmnamen als Argument übergeben oder in der GDB-Eingabeaufforderung mit »file« ein Programm öffnen. Außerdem hängt sich der Debugger auf Wunsch an einen bereits laufenden Prozess an (»gdb Programm PID«). Alternativ erstellen Sie einen so genannten Core-Dump mit »generate-core-file« oder nur »gcore«. Letzterer schreibt einen Speicherauszug im letzten Augenblick der Programmausführung.

Zurzeit unterstützt GDB die Sprachen C, C++, Modula-2, Java, Ada, Fortran und Objective-C. Listing 1 zeigt ein C-Programm als Beispiel zur Demonstration der GDB-Funktionen. Es liefert die minimale Anzahl von Münzen (Stückelung) als Wechselgeld für einen bestimmten Betrag.

Ein mit der Option »-g« kompiliertes Programm lässt sich genauso ausführen, wie jedes andere. Dass es sich mit GDB analysieren lässt, ist lediglich eine Zusatzoption. Den Debugger und das kompilierte Programm laden Sie mit dem Befehl »gdb change«. Er startet GDB und lädt das Programm namens »change« in den Speicher. Ausgeführt wird das Programm allerdings erst dann, wenn Sie GDB den gewählten Startbefehl geben (siehe Kasten "Start nach Wahl"). GDB verfügt über eine eigene Eingabeaufforderung, die auch mit einer History-Funktion hilft.

Listing 2:
List-Befehl

(gdb) list change.c:main
25  {
26    fprintf(stderr, "Eingabe: change <amount>n");
27  }
28
29  int main(int argc, char **argv)
30  {
31    if (argc > 1)
32      CalcChangeFor(atoi(argv[1]));
33    else
34      usage();

Listing 3:
Breakpoints

(gdb) info break
   Num Type           Disp Enb Address    What
   1   breakpoint     keep y   0x080485e0 in main at change.c:31

Das Kommando »run« führt das geladene Programm vom Anfang an aus; der Befehl lässt sich mit »r« abkürzen. Wie bei den meisten GDB-Befehlen können Sie hier zusätzliche Argumente angeben, die als Kommandozeilenparameter interpretiert werden, etwa »(gdb) r 23«.

Ausgangspunkt

Um den Quelltext anzuzeigen, benötigen Sie mit GDB keinen externen Editor. Der »list«-Befehl gibt zehn Zeilen Code ab einer beliebigen Stelle aus (Listing 2). Das Kommando »list change.c:main« zeigt die Funktion »main« sowie einige Zeilen davor. Diese Informationen liest GDB aus dem Quellcode, er muss also auf dem Rechner vorliegen.

Threads debuggen

Auch Programme mit mehreren Threads[4] lassen sich mit Hilfe von GDB debuggen. Dazu dienen die folgenden Befehle:

  • »info threads« listet alle Threads auf.
  • »thread« wählt einen Thread anhand seiner ID
    aus.
  • »thread apply« wendet einen Befehl auf mehrere
    Threads an.

Darüber hinaus lassen sich Breakpoints in einen bestimmten Thread einfügen, mit einem Kommando wie »break 20 thread 1«. Watchpoints dagegen erfüllen ihren Zweck in Programmen mit mehreren Threads kaum, denn sie beobachten ausschließlich Veränderungen innerhalb des aktuellen Thread.

Wenn Sie [Eingabe] drücken ohne ein Kommando einzugeben, wendet GDB den letzten Befehl erneut an. Im Falle von »list« gibt er die nächsten zehn Zeilen aus. Weisen Sie GDB beispielsweise an, nur die nächste Anweisung im Programm auszuführen, tasten Sie sich anschließend mit [Eingabe] Zeile für Zeile durch das Programm.

Im Programm aus Listing 1 führt bei der Fehlersuche ein Zwischenstopp vor der »if«-Abfrage in Zeile 31 auf die richtige Spur. Dazu setzten Sie einen so genannten Breakpoint. Das bedeutet, dass das Programm normal abläuft, bis es die festgelegte Stelle erreicht. An diesem Punkt stoppt der Debugger und bietet über seine Eingabeaufforderung die Möglichkeit zum Eingreifen. Nun lassen Sie die Werte von Variablen ausgeben oder die nächsten Anweisungen schrittweise ausführen. Der »break«-Befehl setzt einen solchen Breakpoint:

(gdb) break change.c:31
Breakpoint 1 at 0x80485e0: file change.c, 
line 31.

Breakpoints bilden die Grundlage des interaktiven Debugging, dementsprechend viele Optionen hängen damit zusammen. Breakpoints können Sie wie in diesem Beispiel für eine bestimmte Zeilennummer, am Anfang einer Funktion, bei einer bestimmten Speicheradresse oder bedingt setzen; zum Beispiel wenn ein Schleifenzähler einen gewissen Wert erreicht hat.

Innerhalb eines Programms sind beliebig viele Breakpoints möglich; sie müssen nicht vor der Programmausführung definiert werden, sondern lassen sich in der GDB-Eingabeaufforderung jederzeit hinzufügen und entfernen. Eine Liste aller gesetzten Breakpoints gibt das Kommando »info break« aus (Listing 3). Tabelle 2 enthält eine Liste weiterer gängiger Breakpoint-Befehle.

Diesen Artikel druckenDiesen Artikel weiterempfehlen Diesen Artikel kommentieren Newsletter abonnieren
Share/Bookmark
Whitepaper
Open Source Datenintegration in der Praxis: Fallstudien und Anwendungsbeispiele

Über die letzten Jahre hinweg haben sich Open Source Lösungen als fester Bestandteil des gesamten Datenintegrationsmarktes etabliert. Viele Unternehmen haben bereits das Open Source Modell für Ihre Datenintegrationsprojekte aufgegriffen. Das vorliegende White Paper illustriert anhand ausgewählter Fallstudien und Anwendungsbeispiele die Implementierung von Open Source Datenintegration in der Praxis und benennt die daraus resultierenden Vorteile.

Download PDF (Registrierung erforderlich)
The Role of Open Source in Data Integration

Obwohl in den letzten Jahren viele technische Fortschritte erzielt werden konnten, verfügen die meisten Datenintegrationsprozesse nach wie vor nur über eine sehr begrenzte Automatisierung. Das vorliegende White Paper von dem Industry Analyst Mark Madson wird zunächst ein grundlegendes Verständnis von Daten Integration vermitteln, die Vorzüge von Open Source Lösungen für Daten Integration erläutern und Ihnen professionelle Empfehlungen geben, damit Sie Ihre Integrationsjobs noch einfacher und produktiver gestalten können.

Download PDF (Registrierung erforderlich)
Kommentare (0)