2012-11-30 23 views
5

Ho un programma multiprocesso eseguito su CPU MIPS con uclibc ed è compilato con gcc 4.5.3. Uno dei processi (è il nome "tv") richiede il collegamento con una libreria condivisa (libtest.so) anch'essa scritta da me. Il processo "tv" è scritto in C++ e libtest.so è in C.Come eseguire il debug del caricamento della libreria condivisa

Ho anche scaricato l'intestazione elf da libtest.so, ha sia il flag PIC che il flag CPIC, quindi penso che la creazione della libreria è OK.

Quando si tenta di eseguire il programma, tutti i processi iniziano correttamente, tranne il processo "tv". Non c'è nessun messaggio di errore. Quando uso ps per controllare il suo stato, è diventato un processo zombie.

Ho provato quanto segue

  1. Se rimuovo il libtest.so dal processo di collegamento e rimuovere qualsiasi riferimento al libtest.so, il processo di "tv" può essere eseguito senza alcun problema.

  2. Se rimuovo alcun riferimento a libtest.so BUT mantieni il file libtest.so nel processo di collegamento, il processo "tv" continua a non funzionare.

  3. Ho provato a utilizzare LD_DEBUG = all per eseguire il debug, ma non funziona nella mia scheda in quanto non esiste un output valido.

Quindi sono che ci sia qualcosa è andato storto quando ld prova a caricare il libtest.so quando processo di "tv" sta iniziando. Ma non so come eseguire il debug? Come dovrei scoprire se la parte di libtest.so che sta causando il problema?

Qualsiasi suggerimento è benvenuto. Grazie in anticipo.

+1

hai provato 'strace'? – mattn

+2

Hmm, domanda molto interessante. Sembra che tu abbia un enorme vantaggio nel controllare la libtest, quindi puoi provare a riprodurre il problema con un semplice processo (non con la tv), quindi rimuovere lentamente tutto da libtest fino a quando il problema non scompare, quindi riaggiungi finché non puoi individuare il problema (stile di ricerca binario). A meno che il problema non sia riproducibile * solo * con la tv e un libtest.so non modificato, nel qual caso, buona fortuna? – Cameron

+0

@mattn Ho usato strace e ho scoperto che ricevo un SIGBUS. Ora vado a cercare di trovare ciò che è causa questo. Grazie mille per il suggerimento. – SSC

risposta

0

Assicurarsi che questo non sia correlato alla mancata dichiarazione C esterna per la propria API che deve essere richiamata come funzioni C.

+0

Sono sicuro che non è dovuto alla mancata dichiarazione "C" di extern, perché il linker non si collegherà in quanto il nome della funzione verrà modificato dal compilatore C++. – SSC

+0

Il tuo libtest.so è compilato con il compilatore C in modo che i nomi delle funzioni non vengano manomessi.Mi chiedo se quando compilerai la tua applicazione tv come si comporterà il compilatore C++ se il tuo file di intestazione che esporta l'API libtest.so non ha la dichiarazione "C" extern. [Riferimento] (http://dsc.sun.com/solaris/articles/mixing.html#c_from_cpp) –

0

Si è verificato un errore nel processo di caricamento. Quindi scrivi l'applicazione più semplice che carica la tua libreria e scarica immediatamente e fai il debug.

Problemi correlati