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:s: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: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:
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, 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:s: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: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