|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Feb 2003
Città: Pavia
Messaggi: 76
|
[C++] Strano errore del linker a run-time
Ciao a tutti!
So che è una domanda molto specifica e particolare, ma non so più come risolvere questo problema, spero che qualcuno abbia qualche idea in merito!!! Sto scrivendo un programma in C++ usando le librerie multipiattaforma Qt4. In particolare devo leggere dei files XML e ho fatto un sistema a plugin che permette di scegliere il parse XML a run-time. Per adesso ho scritto 2 plugin, uno che usa Xerces-c (il parser XML del progetto apache) e uno che usa QtXml (un modulo delle Qt4). Quando l'esecuzione arriva su una particolare riga del programma ricevo un errore ed il programma esce (senza andare in crash). La cosa strana è che l'errore esce solo se arrivo in quel punto facendo una particolare sequenza di operazioni, in tutti gli altri casi funziona benissimo! L'errore è: Codice:
my_program: symbol lookup error: libqtxml_plugin.so: undefined symbol: _ZN15QXmlInputSourceC1EP9QIODevice Su Windows ho compilato con MinGW e sulla Slacware con una versione più vecchia di GCC di quella che ho sulla mia Debian, può essere un problema del nuovo GCC? Non so dove cercare perché il codice apparentemente funziona bene e non andando in crash anche il debugger non mi da informazioni. Qualcuno ha qualche idea in merito? OS: Linux Debian testing Compilatore: gcc (GCC) 4.1.3 20070601 (prerelease) (Debian 4.1.2-12) CPU: AMD AthlonXP 2200+ Kernel: 2.6.18-4-k7 |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Ma la versione delle librerie è la stessa ?
|
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
![]() Codice:
strace -f -F -s 1024 -o <trace.out> <eseguibile>
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Gli header della libreria non sono in linea con la libreria stessa. Cose che capitano se usi la unstable.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#5 |
Member
Iscritto dal: Feb 2003
Città: Pavia
Messaggi: 76
|
Grazie a tutti per le risposte.
Riassumo: 1) [trallallero] ho provato 'strace', ma non mi dice nulla di utile :-( una cosa: mentre va, in 2 punti del programma mi scrive questo (non nel file trace.out ma nella shell): Codice:
umovestr: Input/output error ptrace: umoven: Input/output error 2) [cionci] Non ho capito la domanda se la versione delle librerie è la stessa... Se si riferisce alla varie distribuzioni, la risposta è non lo so, ma in generale no, difficile che 2 distro abbiano le stesse librerie di sistema, inoltre ho provato anche su Windows! 3) [ilsensine] La chiamata che da errore è nelle Qt4 che però ho aggiornato varie volte (le ultime sono le nuove 4.3), aggiungo delle informazioni in merito... Ho provato con varie versioni di Qt4: 4.2.2, 4.2.3, 4.3.0. Il problema c'è da mesi e nonostante tutti gli aggiornamenti alla Debian e alle librerie Qt, non va mai via. Inoltre la cosa strana è che quella funzione funziona benissimo se chiamata dopo certe operazioni, ma dà l'errore se chiamata dopo altre. |
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
hai delle librerie non compatibili, secondo me, ed è per qesto che ti compila e linka senza problemi ma crasha in runtime.
Non è che hai un sistema a 64 bit e alcune librerie non compatibili ? o viceversa (32 bit -> 64). La sto sparando così, ma mi ricordo di aver letto un problema del genere ...
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
ho googlato: umovestr
ed ho trovato questo: http://www.linuxquestions.org/questi...d.php?t=500463 parlano di 32/64 bit e debian io più di così non so che fare ![]()
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
![]() |
![]() |
![]() |
#9 | ||
Member
Iscritto dal: Feb 2003
Città: Pavia
Messaggi: 76
|
Quote:
Quote:
Comunque grazie per il tentativo... Ehm... ho qualche problema ad allegare il file! |
||
![]() |
![]() |
![]() |
#10 |
Member
Iscritto dal: Feb 2003
Città: Pavia
Messaggi: 76
|
Altra serie di allegati...
|
![]() |
![]() |
![]() |
#11 |
Member
Iscritto dal: Feb 2003
Città: Pavia
Messaggi: 76
|
Ultimi...
Perché tante restrizioni sugli allegati? Il file è di 2.1 MB (txt), compresso con bzip2 è 173.3 KB, ma più di 24.4 KB non si possono allegare per file. Così ho splittato il file in pezzi da 24 KB. Solo che il risultato non aveva estensione e anche questo non viene accettato come allegato valido, così ho dovuto rinominarli tutti aggiungendo .txt alla fine. |
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
non funziona, dice archivio corrotto (ho concatenato tutti i files in ordine alfabetico e provato ad unzippare perchè immagino tu abbia prima zippato e poi splittato)
se vuoi mandami il file di trace via mail
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
![]() |
![]() |
![]() |
#13 |
Member
Iscritto dal: Feb 2003
Città: Pavia
Messaggi: 76
|
I comandi da dare per ricomporre i files sono:
Codice:
cat strace.out.bz2_* > strace.out.bz2 bunzip2 strace.out.bz2 http://files-upload.com/356785/strace.out.zip.html |
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
beh, si, non dice niente di più la trace.
l'unica cosa che si capisce è che il simbolo _ZN15QXmlInputSourceC1EP9QIODevice della libreria /home/alessandro/tesi/programma/assomac_jane_viewer/bin/libqtxml_plugin.so non è definito. Ma che ci fa una libreria in una directory bin ? ![]() Perchè non vai nella directory /home/alessandro/tesi/programma/assomac_jane_viewer/bin e fai Codice:
ldd libqtxml_plugin.so mi piacciono 'ste cose da sistemare ma bisognerebbe essere sul posto, così da lontano non si hanno molte possibilità ![]()
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
![]() |
![]() |
![]() |
#15 |
Member
Iscritto dal: Feb 2003
Città: Pavia
Messaggi: 76
|
Allora, cerco di spiegarti un po' come funziona...
Sto facendo un programma che legge dei files in formato XML. Il problema è che in C++ non ci sono molti parser XML (anzi, sono veramente pochi) e non tutti implementano la validazione tramite XSD. L'idea era di trovare un parser XML (SAX) che fosse multipiattaforma, con validazione XSD e senza bachi importanti. L'unico che ho trovato è xerces-c. Siccome non volevo essere legato ad un parser in particolare e siccome la validazione non è identica per tutti i parser (nessuno implementa tutte le funzioni ed ognuno sceglie un sottoinsieme a piacere), ho deciso di far funzionare il mio programma con un sistema a plugin. Il programma si aspetta un'interfaccia standard (che ho scritto io, seguendo l'interfaccia standard del Java, su cui XML è molto più standardizzato che in C++). Poi ho scritto dei plugin (DLL per Windows e SO per Linux) che implementano il parser usando librerie diverse. Questo mi permette di cambiare parser senza modificare il programma e anche di usare parser diversi secondo la piattaforma su cui sta girando (così posso usare anche parser non multipiattaforma). Al momento ho scritto 2 plugin: uno usa la libreria QtXml (tutto il programma è scritto con le librerie Qt4), l'altro usa xerces-c. Il primo non supporta la validazione, ma mi serve di test e come last-resort nel caso nessun altro plugin sia disponibile. Veniamo alla funzione: il codice incriminato è questo Codice:
XmlSaxPlugin::XmlParseResult XmlSaxPluginQtXml::parse(const QString &xmlUrl) { bool parseOk = false; bool errorFound = false; QXmlSimpleReader *reader = xmlReader(); if (reader == 0) { genericError("Unable to parse: no XML reader available."); errorFound = true; } else { try { QIODevice *inputFile = new QFile(xmlUrl); QXmlInputSource *source = new QXmlInputSource(inputFile); parseOk = reader->parse(source, false); delete source; delete inputFile; } catch (...) { // Every other exception genericError(QString("Unexpected Exception!")); errorFound = true; } } if(errorFound || !parseOk) { // Parsing failed return PARSE_ERROR; } else { // Successful parsing return PARSE_VALID; } } La cosa veramente strana è questa! Come fa lo stesso pezzo di codice a funzionare e non funzionare secondo cosa ho chiamato prima??? L'ouput di ldd del mio plugin per Qt4 (comunque avevo già controllato) è: Codice:
linux-gate.so.1 => (0xffffe000) libQtXml.so.4 => /usr/lib/libQtXml.so.4 (0xb7ece000) libQtCore.so.4 => /usr/lib/libQtCore.so.4 (0xb7d50000) libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb7d39000) libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb7c4e000) libm.so.6 => /lib/i686/cmov/libm.so.6 (0xb7c27000) libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7c1c000) libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7ad8000) libfontconfig.so.1 => /usr/lib/libfontconfig.so.1 (0xb7aad000) libz.so.1 => /usr/lib/libz.so.1 (0xb7a98000) libgthread-2.0.so.0 => /usr/lib/libgthread-2.0.so.0 (0xb7a94000) librt.so.1 => /lib/i686/cmov/librt.so.1 (0xb7a8b000) libglib-2.0.so.0 => /usr/lib/libglib-2.0.so.0 (0xb79f8000) libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb79f3000) /lib/ld-linux.so.2 (0x80000000) libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0xb7989000) libexpat.so.1 => /usr/lib/libexpat.so.1 (0xb7969000) |
![]() |
![]() |
![]() |
#16 |
Member
Iscritto dal: Feb 2003
Città: Pavia
Messaggi: 76
|
Tutte quelle righe vuote in fondo alle sezioni 'CODE' non le ho messe io
![]() Nel codice postato, l'uso di "try" e "catch" non serve a niente, era solo una prova, ma quelle funzioni non generano eccezioni (al limite le 'new' in caso di memoria finita). Ti mostro anche il nome della funzione incriminata 'mangled e 'demangled': Codice:
U _ZN15QXmlInputSourceC1EP9QIODevice U QXmlInputSource::QXmlInputSource(QIODevice*) Codice:
nm libqtxml_plugin.so nm -C libqtxml_plugin.so |
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
beh caro IW2NHL (che nick facile da ricordare
![]() ![]() Però non hai ancora detto che ci fa la libreria .so nella directory bin. Non è quello il problema perchè i linker, se non trova i riferimenti, blocca tutto, ma ... non si sa mai. Ma ce l'hai il sorgente delle librerie ? (domanda scema perchè lo sai che se hai il sorgente, compili con -g il tutto, debuggi e becchi l'errore vero ?) Altra cosa: se googli "_N15QXmlInputSourceC1EP9QIODevice" esce un pò di roba tra cui: http://www.qtcentre.org/forum/f-qt-p...post42535.html guarda caso, linker error ![]() PS: Le righe vuote io non le vedo ![]()
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
uhm ... altra idea (ho risolto un problema dove lavoravo prima in questo modo).
vedo da quì: http://doc.trolltech.com/qtopia4.2/qxmlinputsource.html che ci sono 2 costruttori: Codice:
QXmlInputSource::QXmlInputSource ( QIODevice * dev ) Codice:
QXmlInputSource::QXmlInputSource () Codice:
QXmlInputSource *source = new QXmlInputSource(inputFile);
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
![]() |
![]() |
![]() |
#19 | ||||
Member
Iscritto dal: Feb 2003
Città: Pavia
Messaggi: 76
|
Quote:
Su ldd e nm ho imparato da poco (qualche mese) proprio per risolvere i miei problemi su questo programma. Quote:
Quella librera è il plugin che ho scritto io! Visto che è relativa al programma, mi sembrava meglio lasciarla insieme a lui (almeno mentre la sto sviluppando). Quote:
Inoltre il codice che ho postato prima era proprio parte della libreria. Mi spiace, ma anche compilando con -g e analizzando con gdb non ho trovato nulla; tieni presente che il programma non va in crash, esce semplicemente e gdb non dà informazioni in merito, anche chiedendogli un 'backtrace' non esce nulla perché il programma è terminato e non crashato. Comunque se sai come trovare l'errore dal sorgente, dimmi pure! Sicuramente c'è un modo per capire cosa sta succedendo, ma non lo conosco ![]() Quote:
Comunque sono sempre io! Non hai notato lo stesso incomprensibile nick??? ![]() Ho messo la domanda su più forum, ma l'unico in cui ho avuto qualche risposta è questo! HWU è sempre il migliore! Non per niente lo frequento da anni ![]() Questo è strano, che dipenda dal browser? Io uso firefox 2.0 da linux. In ogni modo grazie per i tentativi e per il tempo dedicatomi!!! Ti venisse in mente qualcosa di nuovo... fammi sapere! |
||||
![]() |
![]() |
![]() |
#20 | |
Member
Iscritto dal: Feb 2003
Città: Pavia
Messaggi: 76
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:45.