Irix > Programmieren, Kompilieren

Debuggen mit IRIX...

(1/2) > >>

majix:
So, ich habs jetzt endlich geschafft, ein Programm zu kompilieren und zu linken  :D

Aber es stürzt sofort ab  :'( Naja, groß was anderes hatte ich auch nicht erwartet, da doch ziemlich viel Zeug blind von WIndows nach IRIX portiert ist.

Aber jetzt die Frage: Gibt es einen guten, kostenlosen Debugger für IRIX, so richtig was komfortables mit grafischer Oberfläche?

Ich hab mir den xmgdb angesehen, aber irgendwie klappts nicht so recht, gibts da evtl was besseres?

majix:
Einen guten Debugger (bzw Frontend für gdb) habe ich mit ddd gefunden.

Aber trotzdem habe ich große Probleme: Sobald ich mein Programm starte, erscheint bei gdb die Meldung:
Warning: Signal ? does not exist on this system.

Und dann steht der Debugger :( Was möchte mir diese Meldung sagen?

Beim Linken bekomme ich auch folgende Warnungen:

ld32: WARNING 85: definition of __dynamic_cast in /usr/freeware/lib32/libstdc++.a(tinfo.o) preempts that definition in /usr/lib32/libC.so.2.
ld32: WARNING 127: Two shared objects with the same soname, /usr/lib32/mips3/libm.so and /usr/lib32/libm.so, have been been linked. This is probably due to a missing -L specification. Ignoring the latter.
ld32: WARNING 127: Two shared objects with the same soname, /usr/lib32/mips3/libm.so and /usr/lib32/libm.so, have been been linked. This is probably due to a missing -L specification. Ignoring the latter.

Welche der LIBs ist denn die richtige? Und wie sage ich das dem Linker/Compiler?

sgt_barnes:
Mit "-L<pfad>" kann man ein Verzeichnis angeben, in dem der Linker zuerst mal nach den angegebenen Bibliotheken suchen soll.

Wenn Du also die libm.so aus dem Verzeichnis /usr/freeware/lib32/ nehmen willst, schreibst Du einfach "-L/usr/freeware/lib32" vor Deine ganzen -lsonstwas.

In den "lib32"-Verzeichnissen sind Bibliotheken für n32-Executables. In denen mit einfach nur "lib" stehen normalerweise die o32-Bibliotheken.

Debuggen mit den Kommandozeilendebuggern wie dbx oder gdb ist nicht so schwierig, wie es aussieht:

"where" macht einen stack-trace und "list" zeigt die paar Zeilen um die aktuelle Position an. Mit "step" kann man eine Zeile vor, "stop at <Zeilennummer>" setzt einen Breakpoint und "run" startet den gecrashten Prozess von vorn. "help" listet alle Kommandos auf und "help <Kommando>" liefert eine Beschreibung für das Kommando.

Ein Beispiel:


--- Code: ---
bash-2.04$ dbx crasher
dbx version 7.2.1 Mar 13 1998 19:00:36
Core from signal SIGSEGV: Segmentation violation
(dbx) where
>  0 main(argc = 1, argv = 0x7fff2f24) ["/usr/people/tkrueger/data/source/crasher/crasher.c":5, 0x10000fb4]
  1 __start() ["/xlv55/kudzu-apr12/work/irix/lib/libc/libc_n32_M3/csu/crt1text.s":17
7, 0x10000e50]
(dbx) list
>*   5          (*p)++;
    6          
    7          return 0;
    8  }
(dbx) print p
(nil)

--- Ende Code ---


Wie man sieht ist mein Programm in der Funktion "main" in Zeile 5 abgestürzt, weil es versucht hat den NULL-Zeiger p zu dereferenzieren.

Das sollte reichen, um rauszufinden, wo die Sache in die Hose geht. ;)

Tilmann



Anhang 1: crasher.c


--- Code: ---
int main (int argc, char *argv [])
{
     int *p = 0;
     
     (*p)++;
     
     return 0;
}

--- Ende Code ---


Anhang 2: Kompilierungskommando

gcc -g crasher.c -o crasher

majix:
Mit den Linkerpfaden hab ichs mittlerweile auch hingekriegt, allerding bleibt immer noch die erste Warnung stehen - und das obwohl ich gar nicht die /usr/freeware/lib32 Bibliotheken angegeben habe. Evtl verwendet gcc die automatisch?

Vielen Dank, ich habe jetzt auch mal dbx getestet, das funktioniert wesentlich besser als gdb. Damit finde ich jetzt wenigstens meine Fehler, und es kommt auch mit pthreads klar - von denen mache ich massiv gebrauch.

sgt_barnes:
pthreads: Richtig! Jetzt fällts mir wieder ein! Genau das war der Grund, warum ich den gdb unter IRIX nicht benutze! Unter Linux nehm ich den ja auch! Aber ich konnte irgendwie halt nicht erklären, warum ich unter IRIX den dbx nehme...

libstdc++: Ja, die linkt der gcc automatisch dazu. Warum er allerdings auch der Meinung ist, die andere libC (das gleiche von sgi) einbinden zu müssen, ist mir nicht klar. Eventuell hilft ein
ldd <executable>
um rauszufinden, was der dynamische Linker so alles einbindet.

Ich guck heute Abend mal, was da bei mir so alles drinsteht und melde mich dann wieder.

Schönen Tag noch,
Tilmann

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln