Netatalk Paket (TimeMachine): Devs gesucht / Looking for Devs

Fehler gefunden

So, habe mir jetzt die halbe Nacht um die Ohren gehauen um das Equivalent eines gdb-backtraces zu haben.

Folgende Callchain tritt auf:

netatalk::cnid_dbd::dbif.c::dbif_env_open() : db_env->open()

-> landet in der berkeley-DB in

db-4.8.30::env::env_region.c::__env_remove_env()

-> hier wird die alte DB gelöscht, bevor eine neue angelegt wird (rebuild). Dass es initial noch keine DB gibt stört nicht, die Funktion wird trotzdem prophylaktisch aufgerufen.

-> landet in __env_remove_file()

Sucht das gesamte .AppleDB-Verzeichnis welches die DB-Dateien mit den CNID-Infos enthaelt durch und soll dann alles an DB-resten weglöschen was kaputt ist. Dazu ruft es

-> db-4.8.30::eek:s::eek:s_dir.c::__os_dirlist()

auf. Die os_*-Funktionen sind ein Abstraktionslayer in der Berkeley-DB die die OS-Funktionen wegabstrahieren. Die Berkeley-DB kann nämlich auch mit nicht-POSIX-Systemen. Die __os_dirlist() Funktion soll einen Verzeichnisinhalt zurückliefern. Also praktisch wie ein glob() in Perl. Dazu verwendet sie

-> libc:uClibc::eek:pendir(3), readdir(3) und stat(2)

, also die C-Library Standardfunktionen dafür. readdir(3) ist laut

http://www.uclibc.org/downloads/old-releases/ChangeLog-0.9.29_0.9.30

kaputt:

Code:
r20625 | carmelo | 2007-12-05 18:25:04 +0100 (Wed, 05 Dec 2007) | 8 lines

Fix opendir problem when statically linked due to a missing
initialization of the mutex field within DIR struct.
When linked dynamically instead, __pthread_mutex_init will
initialize the mutex itself. Without this fix, any call to
readdir will stuck forever trying to acquire the mutex.

Signed-off-by: Carmelo Amoroso <[email protected]>

Wie wir das am besten fixen/umgehen ist mir noch nicht ganz klar.
Vielleicht fällt Dir (Sven) / jemand anderem der sich mit Freetz gut auskennt ja was ein. Soweit ich das sehe ist die uClibc eh eine modifizierte, vorkompilierte Variante die irgendwo hergeholt wird während des Freetz-Buildprozesses. Vielleicht kann man ja die Quelle reparieren oder gleich updaten.

N8,
--j
 
So wie sich das letzte Changeset aus der folgenden Reihe liest workaround, workaround cleanup, revert last changes ist die Funktion doch nicht kaputt. Außerdem linkt Ihr doch nicht statisch, oder?

Ich würde tippen, dass das Problem darin besteht, dass libdb gegen libpthread gelinkt ist und Euer Binary nicht (habe das letztere nicht verifiziert). Wenn ich mich richtig erinnere, verlangt die pthread-Implementierung von uClibc, dass jedes Binary, welches von einer Library abhängt, welche wiederum von libphtread abhängt, dass dieses explizit/direkt gegen libpthread gelinkt wird.
 
Ich würde tippen, dass das Problem darin besteht, dass libdb gegen libpthread gelinkt ist und Euer Binary nicht

Dazu gibt es eine Bemerkung in der Doc: "In case you are building on a recent RedHat release, please use --with-mutex="x86/gcc-assembly" on x86 platforms to prevent Berkeley DB from linking against libpthread."

http://netatalk.sourceforge.net/2.1/htmldocs/installation.html#build-bdb

dg1kjd schrieb:
Soweit ich das sehe ist die uClibc eh eine modifizierte, vorkompilierte Variante die irgendwo hergeholt wird während des Freetz-Buildprozesses.

Die uClibc kann man auch selber bauen, braucht aber etwas Platz und viel Zeit. Mit "make menusetup" stellst du das hier ein:

Code:
Advanced options ->
  Compiler options ->
    Toolchains ->
      (X) Build toolchain
 
ldd sagt...

Ldd sagt:

Code:
root@fritz:/sbin# ldd cnid_dbd 
	libdb-4.8.so => /usr/lib/freetz/libdb-4.8.so (0x2aabe000)
	libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x2ab98000)
	libc.so.0 => /lib/libc.so.0 (0x2aba9000)
	libpthread.so.0 => /lib/libpthread.so.0 (0x2ac24000)
	ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0x2aaa8000)

Ist also gegen libpthread gelinkt. Spielt die Reihenfolge eine Rolle?

Irgenwie taucht dieser Pthread-Kram die letzten 10 Jahre lang immer im Zusammenhang mit Problemen auf, aber nie mit Lösungen... :-(

-j
 
Fix opendir problem when statically linked due to a missing
initialization of the mutex field within DIR struct.
When linked dynamically instead, __pthread_mutex_init will
initialize the mutex itself. Without this fix, any call to
readdir will stuck forever trying to acquire the mutex.

Okay, die Symptome stimmen. Wenn ich das richtig lese, besteht dieses Problem aber nur, wenn statisch gelinkt wurde. Dazu in der Netatalk-Doc:

To link Netatalk statically to Berkeley DB, you have to disable shared libraries when building Berkeley DB. If shared libraries exist, Netatalk will always link to them, even if a static version exists in the same location.

Ich probiere es mal mit --disable-static und --enable-shared, aber im Moment kann die FB nicht flashen, da meine Freundin mich sonst lyncht. ;-)

Wie kann man herausfinden, ob statisch gelinkt wurde oder nicht?
 
Ob der Bug in 0.9.30 gefixt ist, könnt Ihr relativ einfach testen, indem Ihr die Toolchain selbst baut und dabei die uClibc-Version auf 0.9.30 umstellt.
 
--disable-static und --enable-shared hilft nicht, ich kompiliere aber gerade die .30er Toolchain - dauert freilich ein Weilchen.
 
re: zeug

svoop: _Genau_ das Problem mit dem nicht flashen können kenne ich auch :)
er13: hab ich auch schon in Erwägung gezogen, würde aber dann Probleme an anderen Stellen erwarten. z.B. ist es fragwürdig ob die AVM-Binaries mit der neuen uClibc zurecht kommen oder? Ist die 30er Version mal getestet worden irgendwo oder ist Sven jetzt der erste?

Insgesamt finde ich das Problem ist es wert trotzdem genau angeschaut zu werden, selbst wenn die 30er Version perfekt funktioniert. Ich Vermute die Ursache in der Weise wie db-4.8 gebaut wird, es ist also nur eine Frage der Zeit bis die nächste App, die diese lib verwendet, bricht.

Ich vermute es hat was damit zu tun wo die __pthread_mutex_init Funktion letztlich hergenommen wird. Und zwar beim Aufruf aus libc::eek:pendir(). Ich vermute weiterhin, dass das davon abhängt wie der ganze Kram zusammengelinkt wird, i.e. ob irgendwelche als weak-symbols exportierte stubs dieser Funktion verwendet werden oder die korrekten aus der libpthread.

-j
 
z.B. ist es fragwürdig ob die AVM-Binaries mit der neuen uClibc zurecht kommen oder? Ist die 30er Version mal getestet worden irgendwo oder ist Sven jetzt der erste?

Das würde mich auch interessieren, bevor ich die FB bricke :)
 
Ich kann's mir zeitlich im Moment nicht leisten, die FB zu bricken. Wie gesagt, meine Freundin geht mir sonst an die Gurgel, da sie gerade sehr viel Arbeit hat und ohne Link bleibt das liegen. Wenn schon mal jemand die 30er Toolchain benutzt und die FB nicht gebrickt hat, würde ich das Risiko schon eingehen, ansonsten würde ich lieber warten, bis ich eine 2. FB habe. (Ich brauche eh eine, fehlt nur noch ein Touri als Kurier, um sie von CH nach ES zu bringen.)
 
Machs dir doch einfach:
build/modified/filesystem auf einen USB-Stick kopieren und dann "chroot /var/media/ftp/uStor0x /bin/sh".

Gruß
Oliver
 
Extrem gute Idee, danke!

Ausserdem habe ich gerade festgestellt, dass wenn man bei "build toolchain" in make menu "build target-gdb" (oder so) anschaltet, dass am Ende wirklich ein brauchbarer GDB rausfällt den man schnell mit scp auf die Box kopieren kann. Das vereinfacht natürlich so einiges, danke!!!

Da hätte ich mir die printf-Orgien gestern wahrscheinlich sparen können.

--j
 
gdb backtrace

Speaking about einfach machen.... Das hätte mir gestern einen Tag langweiliges Debuggen erspart:


0x2abc5958 in sigsuspend () from /lib/libc.so.0
(gdb) bt
#0 0x2abc5958 in sigsuspend () from /lib/libc.so.0
#1 0x2ac73cc8 in __pthread_wait_for_restart_signal () from /lib/libpthread.so.0
#2 0x2ac724f8 in __pthread_alt_lock () from /lib/libpthread.so.0
#3 0x2ac6f6bc in pthread_mutex_lock () from /lib/libpthread.so.0
#4 0x2abc77b4 in readdir64 () from /lib/libc.so.0
#5 0x2ab69344 in __os_dirlist () from /usr/lib/freetz/libdb-4.8.so
#6 0x2ab45444 in __env_remove_env () from /usr/lib/freetz/libdb-4.8.so
#7 0x2ab41e84 in __env_open () from /usr/lib/freetz/libdb-4.8.so
#8 0x00403ad4 in _ftext ()
#9 0x2ac04928 in free () from /lib/libc.so.0
#10 0x0040a2d4 in ?? ()

“Wenn ich acht Stunden Zeit hätte um einen Baum zu fällen, würde ich sechs Stunden die Axt schleifen.”
Abraham Lincoln

--j
 
Bug gefunden die 2.

Hi,

ok, er13 hatte Recht, das Problem ist, dass die uClibc anscheinend nicht damit klar kommt, wenn ein executable nicht explizit gegen die libpthread gelinkt ist, aber eine andere Library, die es verwendet (hier: die libdb).
Ich dachte ursprünglich (siehe ldd output), dass die netatalk Sachen gegen die libpthread gelinkt sind. Sind sie aber nicht. Das ldd Tool zeigt die libpthread sowieso als benötigte Library an, weil die libdb gegen sie gelinkt ist.

Wenn ich den cnid_dbd daemon explizit mit -lpthread linke, dann ist der crash jedenfalls behoben. :)

Mal sehen wie ich dem netatalk.mk File das am besten beibringe...

--j
 
FYI: Nachschauen geht mit readelf -d file

Dieses Changeset scheint vom Commit-Message-Lesen her das Problem zu beheben

@Devs: mag jemand es mal backportieren ;-)
 
Zuletzt bearbeitet:
This fix the problems if libc is linked before libpthread or if libpthread is pulled by a dependency library.
Kann man das so verstehen, dass das Problem sich durch eine richtige Linkreihenfolge umgehen lässt? Liest sich ja auch in der Antwort von dg1kjd so.

Gruß
Oliver
 
Danke für den readelf Tip! Solche Sachen helfen immer ungemein weiter.

POSIX mutexes:
In der Tat war das Problem dass die opendir() Funktion in der uClibc nicht die libpthread-Implementation, sondern die eigene (von mir ungenau/inkorrekt als "stub" bezeichnet) verwendet hat. Ich verstehe immer noch nicht ganz wie das passieren konnte, die libc-Variante war laut nm definintiv als "weak" (w/W) gekennzeichnet, die in der libpthread normal ("T"). Alle Referenzen als "U".
Wieso baut der ld.so dann derartigen Mist? Wie die Sache aufzulösen ist ist doch ziemlich offensichtlich.
Dass man das Teil nicht als standalone-Executable im verbose-Modus aufrufen kann ist übrigens nicht gerade hilfreich in so einer Situation.

BTW:
Ich bin nicht ganz sicher wo die libdb noch Verwendung findet in Freetz. Es mag u.U. Sinn machen die anderen Apps auch nach der Verwendung von
-lpthread zu durchforsten.


Jetzt bin ich übrigens soweit, dass der cnid_dbd nicht mehr hängt, aber ironischerweise funktioniert nun die libdb nicht beim rebuilden des Environments wegen fehlenden POSIX-Mutexes zum locken des Environments ("Function not implemented")... :-(

--j

-j
 
dass das Problem sich durch eine richtige Linkreihenfolge umgehen lässt?
Nein, nur durch explizites linken gegen pthread. Dieser Teil des Satzes "if libc is linked before libpthread" ist folgendermaßen zu verstehen: das Hauptbinary ist explizit sowohl gegen libc als auch gegen pthread gelinkt, libc kommt aber vor pthread vor. Auf netatalk/libdb trifft der zweite Teil zu "if libpthread is pulled by a dependency library".

@dg1kjd: Das Weak-Symbol aus libc wird früher aufgelöst als libdb geladen. Fehler an der Stelle ist die Tatsache, dass libc die entsprechenden Symbole auch definiert und nicht nur Prototypes deklariert.
Code:
It is not possible for libpthread to override the weak libc [B]definitions[/B].
The proper thing to do is have weak prototypes in libc, and definitions in libpthread only.
 

Neueste Beiträge

Statistik des Forums

Themen
244,878
Beiträge
2,220,032
Mitglieder
371,603
Neuestes Mitglied
broekar
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.