Wie debuggen?

jw
Interessierter
Interessierter
Beiträge: 56
Registriert: Dienstag 12. Juli 2005, 22:48

Wie debuggen?

Beitrag von jw »

Hallo!

Eben wollte ich mich auf die Suche nach einem Kaefer machen:

Code: Alles auswählen

/mnt/test # ./gdbserver 192.168.1.12:1234 ./neutrino
Process ./neutrino created; pid = 809
./gdbserver: relocation error: ./gdbserver: symbol ptrace, version GLIBC_2.0 not defined in file libc.so.6 with link time reference

Child exited with retcode = 7f
Listening on port 1234
Hat jemand eine Idee was ich da flasch gemacht habe?
Npq
Senior Member
Beiträge: 1339
Registriert: Donnerstag 24. April 2003, 12:12

Beitrag von Npq »

Hmm, sieht aus als wenn die libc gestrippt wurde und ihr daher der ptrace()-Systemaufruf fehlt.

Versuchst du evtl. von einem Image aus zu debuggen?
jw
Interessierter
Interessierter
Beiträge: 56
Registriert: Dienstag 12. Juli 2005, 22:48

Beitrag von jw »

Npq hat geschrieben:Hmm, sieht aus als wenn die libc gestrippt wurde und ihr daher der ptrace()-Systemaufruf fehlt.

Versuchst du evtl. von einem Image aus zu debuggen?
Hmmm, jein :)

Ich habe zwar ein image gebootet, aber das zu debuggende programm liegt auf einem NFS-Dateisystem.

Soeben bin ich in configure.ac auf folgende Stelle gestossen:

Code: Alles auswählen

	if test "$TARGETRULESET" = "standard"; then
		TARGET_CFLAGS="$TARGET_CFLAGS -O2 -g3 -gdwarf-2"
		TARGET_LDFLAGS=""
	elif test "$TARGETRULESET" = "flash"; then
		TARGET_CFLAGS="$TARGET_CFLAGS -Os"
		TARGET_LDFLAGS="-s"
	fi
und in Makefile.am:

Code: Alles auswählen

if TARGETRULESET_FLASH
CONFIGURE_OPTS_DEBUG = \
	--without-debug
endif
Mit anderen Worten, mit --with-targetruleset=flash wird automatisch debugging disabled. Waere es denn nicht besser das debugging mit einer eigenen unabhaengigen Option (--with-targetdebug oder sowas aehnliches) zu enablen/disablen? Den Default von --with-targetdebug kann man ja abhaengig von --with-targetruleset machen, um das jetzige Verhalten (strip bei --with-targetruleset=flash) beizubehalten.

Wuerde so eine Aenderung Sinn machen? Wenn ja, dann wuerde ich einen entsprechenden Patch abliefern. (kann aber ein bisserl dauern, kenne die autotools nur oberflaechlich)
Houdini
Developer
Beiträge: 2183
Registriert: Mittwoch 10. Dezember 2003, 07:59

Beitrag von Houdini »

das löst aber dein Problem nicht, denn immer noch gilt:
Hmm, sieht aus als wenn die libc gestrippt wurde und ihr daher der ptrace()-Systemaufruf fehlt.
es wird die libc aus dem Flash genommen und die ist gestripped

edit: kannst ja die libc statisch zu neutrino linken
dcdead2
Interessierter
Interessierter
Beiträge: 61
Registriert: Sonntag 13. März 2005, 10:25

Beitrag von dcdead2 »

Wär's nicht am einfachsten die libc aus dem cdkroot/lib Verzeichnis ins image zu spielen?
Houdini
Developer
Beiträge: 2183
Registriert: Mittwoch 10. Dezember 2003, 07:59

Beitrag von Houdini »

am einfachsten schon, wahrscheinlich passt es nicht rein!!
vielleicht kannst du anstatt libc ein link auf deine nfs libc machen, und später wieder zurück auf die flash libc zeigen lassen,
aber vorsicht: Ohne libc startet die box nicht mehr
jw
Interessierter
Interessierter
Beiträge: 56
Registriert: Dienstag 12. Juli 2005, 22:48

Beitrag von jw »

Houdini hat geschrieben:am einfachsten schon, wahrscheinlich passt es nicht rein!!
Hmm, da sind noch 1.1MB frei. Denke schon dass das noch passen muesste. Zumindest fuer die ungestrippte libc muesste das noch passen.
vielleicht kannst du anstatt libc ein link auf deine nfs libc machen, und später wieder zurück auf die flash libc zeigen lassen,
aber vorsicht: Ohne libc startet die box nicht mehr
Ich wuerde es vorziehen, eine libc ins flash zu legen die zwar ohne debug-symbole uebersetzt aber nicht gestript wurde. Wenn man ein image flasht weiss man schliesslich nicht ob man irgendwann in den kommenden Wochen in die Verlegenheit kommt den debugger anzuwerfen.

Folglich muesste man fuer fuer die libc (und nur fuer diese) das -s aus den TARGET_LDFLAGS entfernen...

Es bleibt die Frage wie mit dem --without-debug aus Makefile.am zu verfahren ist. Worauf wirkt sich diese Option aus?
jw
Interessierter
Interessierter
Beiträge: 56
Registriert: Dienstag 12. Juli 2005, 22:48

Beitrag von jw »

dcdead2 hat geschrieben:Wär's nicht am einfachsten die libc aus dem cdkroot/lib Verzeichnis ins image zu spielen?
Die ist aber doch schon gestrippt?
Npq
Senior Member
Beiträge: 1339
Registriert: Donnerstag 24. April 2003, 12:12

Beitrag von Npq »

Warum bootest du nicht über NFS?

Der Begriff "gestrippt" ist in der Tat mehrdeutig, einmal bezeichnet es das was das Programm "strip" durchführt, nämlich die Debugsymbole entfernen und dann meint man damit noch den "mklibs"-Durchlauf, welcher nicht verwendete Bibliotheksfunktionen komplett entfernt.

Und nur letzterer ist dafür verantwortlich, daß ptrace() nicht mehr in der Libc enthalten ist.

Da ich mich mit Images nicht beschäftige kann ich dir so nicht sagen wo das genau passiert, aber die Imagebauer können da sicherlich weiterhelfen.
dcdead2
Interessierter
Interessierter
Beiträge: 61
Registriert: Sonntag 13. März 2005, 10:25

Beitrag von dcdead2 »

jw hat geschrieben:
dcdead2 hat geschrieben:Wär's nicht am einfachsten die libc aus dem cdkroot/lib Verzeichnis ins image zu spielen?
Die ist aber doch schon gestrippt?
Sind IIRC alle Symbole drinne, da, wie npq geschrieben hat, diese erst beim mklibs durchlauf raus kommen und dieser ja beiden den Sachen in cdkroot nicht angewendet wird
jw
Interessierter
Interessierter
Beiträge: 56
Registriert: Dienstag 12. Juli 2005, 22:48

Beitrag von jw »

Npq hat geschrieben:Warum bootest du nicht über NFS?
Zum Einen habe ich nicht wirklich eine Ahnung, wie sowas aufzusetzen waere (und eine gute Anleitung konnte ich noch nicht finden).

Andererseits moechte dass meine debug-Umgebung moeglichst nahe an der real-Umgebung (und das ist nunmal ein geflashtes system) ist. Nur so hat man eine reelle chance, bugs zu erkennen und zu lokalisieren (IMHO). Mit anderen Worten: normalerweise will ich ein geflashtes System verwenden. Aber manchmal habe ich eben das Beduerfnis, mich auf Kaefersuche zu begeben.
Npq hat geschrieben:Der Begriff "gestrippt" ist in der Tat mehrdeutig, einmal bezeichnet es das was das Programm "strip" durchführt, nämlich die Debugsymbole entfernen und dann meint man damit noch den "mklibs"-Durchlauf, welcher nicht verwendete Bibliotheksfunktionen komplett entfernt.

Und nur letzterer ist dafür verantwortlich, daß ptrace() nicht mehr in der Libc enthalten ist.
Ah, die mklibs-geschichte kannte ich noch nicht. Ohne es genauer zu wissen, erschleicht mich die Ahnung als ob das genau das ist was ich suche. Schliesslich will ich ja nicht die glibc debuggen :). Gibt es eine halbwegs einfache Moeglichkeit, den mklibs-durchlauf abzustellen?
Da ich mich mit Images nicht beschäftige kann ich dir so nicht sagen wo das genau passiert,
Mit dem Hinweis auf mklibs hast du mir sehr viel mehr geholfen als ich mir erhofft haette.
jw
Interessierter
Interessierter
Beiträge: 56
Registriert: Dienstag 12. Juli 2005, 22:48

Beitrag von jw »

Habe jetzt mal die ungestrippte libc rueberkopiert. gdbserver laeuft jetzt damit. Aber:

Code: Alles auswählen

/var/tmp/build-yadi/dbox/cdk/bin/powerpc-tuxbox-linux-gnu-gdb \
  -d /usr/local/src/foo foo
set solib-absolute-prefix /var/tmp/build-yadi/dbox/cdkroot
set solib-search-path     /var/tmp/build-yadi/dbox/cdkroot/lib
handle SIG32 pass nostop noprint
target remote 192.168.1.14:1234
break main
continue
Breakpoint 1, 0x10001ba4 in main ()
(gdb) list
1       ../../gcc-3.3.5/gcc/libgcc2.c: Datei oder Verzeichnis nicht gefunden.
        in ../../gcc-3.3.5/gcc/libgcc2.c
Da scheint noch etwas krumm zu sein... Hat jemand eine Idee?
Houdini
Developer
Beiträge: 2183
Registriert: Mittwoch 10. Dezember 2003, 07:59

Beitrag von Houdini »

er sucht jetzt den sourcecode zu den routinen die vom gcc dazugesteuert wurden, die gcc sourcen wurden ja wieder aus dem cdk rausgelöscht.
mach einfach weiter
jw
Interessierter
Interessierter
Beiträge: 56
Registriert: Dienstag 12. Juli 2005, 22:48

Beitrag von jw »

Houdini hat geschrieben:er sucht jetzt den sourcecode zu den routinen die vom gcc dazugesteuert wurden, die gcc sourcen wurden ja wieder aus dem cdk rausgelöscht.
mach einfach weiter
Hmmm, das verstehe ich jetzt aber nicht ganz... Ich will doch nicht den gcc debuggen. Das ist doch _mein_ main() und nicht das vom gcc? :gruebel:

Und wie kriege ich das listing des zu debuggenden Programmes?
Npq
Senior Member
Beiträge: 1339
Registriert: Donnerstag 24. April 2003, 12:12

Beitrag von Npq »

Die C-Runtime muß initialisiert werden, dafür werden wie Houdini schon sagte bestimmte Teile an statischem Code zur Anwendung hinzugelinkt.

Der gdb weiß aber trotzdem noch wo der Code hingehört und sucht dann danach.

Sobald du "deinen" Code erreichst, landest du schon automatisch in der richtigen Sourcedatei.
jw
Interessierter
Interessierter
Beiträge: 56
Registriert: Dienstag 12. Juli 2005, 22:48

Beitrag von jw »

Npq hat geschrieben:Die C-Runtime muß initialisiert werden, dafür werden wie Houdini schon sagte bestimmte Teile an statischem Code zur Anwendung hinzugelinkt.
Ist schon klar, aber: ich habe den breakpoint ja nicht in die c-runtime gesetzt. main() ist doch nicht mehr Bestandteil der crt. Auch wenn ich den breakpoint auf irgendeine meiner routinen setze, kriege ich auch keine source angezeigt.
Npq hat geschrieben: Der gdb weiß aber trotzdem noch wo der Code hingehört und sucht dann danach.
offensichtlich nicht :-?
Npq hat geschrieben:Sobald du "deinen" Code erreichst, landest du schon automatisch in der richtigen Sourcedatei.
Leider nicht :-(
Npq
Senior Member
Beiträge: 1339
Registriert: Donnerstag 24. April 2003, 12:12

Beitrag von Npq »

Hmm, ich sehe auch gerade, daß das ja gar nicht die C-Runtime ist, sondern die libgcc2 und das "continue" bei dir hatte ich auch übersehen. :oops:

Also normalerweise sieht das so aus:
(gdb) break main
Breakpoint 1 at 0x10000514: file helloworld.c, line 5.
(gdb) continue
Continuing.

Breakpoint 1, main (argc=268437668, argv=0x7fba7e94) at helloworld.c:5
5 printf("HelloWorld\n");
(gdb) list
1 #include <stdio.h>
2
3 int main (int argc, char **argv)
4 {
5 printf("HelloWorld\n");
6 return 0;
7 }
Die Option "-d" braucht man eigentlich nicht, der absolute Pfad zu den Sourcen wird in den Debug-Informationen gespeichert.

Seltsam.
Houdini
Developer
Beiträge: 2183
Registriert: Mittwoch 10. Dezember 2003, 07:59

Beitrag von Houdini »

break main
continue
scheinbar hat er den Breakpoint gar nicht gesetzt
jw
Interessierter
Interessierter
Beiträge: 56
Registriert: Dienstag 12. Juli 2005, 22:48

Beitrag von jw »

Hab es jetzt am Laufen. Die Debug-Symbole waren nicht sauber einkompiliert. Danke an alle die geholfen haben.

Wieso wird gdb eigentlich mit "--host=$(target)" anstatt mit "--host=$(build) --target=$(target)" uebersetzt? Es macht doch keinen Sinn, den gdb (immerhin 3MB) in ein Image zu packen oder doch?