Domanda

sto utilizzando dlopen () in un modulo di Apache che sto scrivendo in modo che io possa avere un sistema di plugin per il mio modulo. Ho scoperto che se io compilo il mio modulo, compilo il mio plug-in, e avviare Apache, tutto funziona peachy-keen.

Se, invece, dopo aver fatto tutto questo, ho ricompilare il mio plug-in, (facendo una piccola modifica o due per il codice plugin,) il mio prossimo caricamento della pagina causerà Apache per segmentation fault. Ogni richiesta successiva funziona bene, ancora una volta. Così, è solo il primo caricamento della pagina subito dopo la compilazione che fa sì che il segfault.

Ho cercato di affrontare questo per un paio di giorni (io non sono grande a C il debug) e oggi, ho notato nei miei log di errore apache:

Inconsistency detected by ld.so: dl-close.c: 719: _dl_close: Assertion `map->l_init_called' failed!

Qualcuno ha idea di cosa sta succedendo? Questo significa che non è il mio codice e che sono stato a caccia di un bug fantasma? Sono abbastanza fiducioso che dlcose () che io chiamo per ogni chiamata a dlopen (). Tuttavia, questo particolare bug / segfault sembra accadere quando si esegue apache in modalità single-process e iniziare ad aggiornare la pagina in fretta.

È stato utile?

Soluzione

Alcune idee:

  1. Probabilmente si chiama dlopen() più di una volta? dl biblioteca gestisce i contatori di riferimento che viene incrementato ad ogni modo dlclose() RTLD_NODELETE scaricherà le libreria solo se il contatore == 0.

  2. È stato specificato strace bandiera per strace -p<pid> (supponendo che si sono su Linux)? Se sì, <=> non scaricare la libreria.

Hai provato a chiamate di sistema di debug con <=>? Avviare Apache, trova il suo pid e tracciare tutte le chiamate di sistema Apache doesn chiamando <=>. Probabilmente vi darà qualche idea di cosa sta succedendo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top