2010-04-27 13 views
8

Sto sviluppando un progetto in VC++ 2008. Il progetto utilizza la libreria OpenCV (ma suppongo che ciò si applichi a qualsiasi altra libreria). Sto lavorando con la configurazione di Debug, le proprietà del linker includono le versioni di debug della libreria .lib come dipendenze aggiuntive. Nelle directory VC++ in Strumenti | Opzioni ho impostato la directory include, la directory .lib e anche le directory di origine per la libreria. Ottengo un errore durante la chiamata a una delle funzioni dalla libreria e mi piacerebbe vedere esattamente cosa sta facendo quella funzione. La riga che genera l'errore è:Come eseguire il debug di una libreria esterna (OpenCV) in Visual C++?

double error = cvStereoCalibrate(&calObjPointsM, &img1PointsM, &img2PointsM, 
&pointCountsM, 
&cam1M, &dist1M, &cam2M, &dist2M, imgSize, &rotM, &transM, NULL, NULL, 
cvTermCriteria(CV_TERMCRIT_ITER + CV_TERMCRIT_EPS, 100, 1e-5)); 

a impostare un punto di interruzione in questa linea per vedere come la funzione cvStereoCalibrate() fallisce. Sfortunatamente il debugger non mostrerà il codice sorgente per questa funzione quando premo "Step into". Salta immediatamente al cvTermCriteria() (che è una semplice funzione inline, macro-kinda) e mostra il suo contenuto. C'è qualcos'altro che devo fare per poter inserire le funzioni della libreria esterna nel debugger?

EDIT: Penso che la funzione cvTermCriteria() mostri nel debugger, poiché è definita in un file di intestazione, quindi immediatamente accessibile al progetto.

EDIT2: I file PDB mancavano per i file di libreria, ora ho ricompilato la libreria OpenCV in Visual C++ nella configurazione di debug, esistono i file PDB, ma sono ancora in qualche modo invisibile al debugger:

Caricato 'C: \ Users \ DarekSz \ Documents \ Visual Studio 2008 \ Projects \ libcci \ Debug \ ccisample.exe', Simboli caricati.
'ccisample.exe': Loaded 'C: \ Windows \ SysWOW64 \ ntdll.dll'
'ccisample.exe': Loaded 'C: \ Windows \ SysWOW64 \ kernel32.dll'
'ccisample.exe': Caricato 'C: \ Windows \ SysWOW64 \ KernelBase.dll'
'ccisample.exe': Caricato 'C: \ OpenCV2.1 \ bin \ cv210d.dll'
'ccisample.exe': caricato 'C: \ OpenCV2 .1 \ bin \ cxcore210d.dll '

I simboli non vengono caricati apparentemente per le DLL opencv. Tuttavia, i file .pdb esistono nella directory \ bin.

+0

La DLL di OpenCV è stata compilata con le informazioni di debug? – Mark

+0

Ho scaricato la versione 2.1 OpenCV, quella che è stata preparata appositamente per vC++ 2008, ha librerie statiche, normali e di debug (ad esempio cxcore210.lib vs. cxcore210d.lib). Sto usando quest'ultimo. Suppongo che potrebbero essere librerie di importazione per una DLL, ma non penso che siano ... – neuviemeporte

+1

Risulta che sto usando DLL dalle librerie di esportazione in realtà. – neuviemeporte

risposta

12

Per riassumere tutta l'attività nei commenti: la chiave della soluzione era ricostruire la libreria in VC++ per ottenere i file .pdb (Programma debug database) per il debug, le librerie dei suffissi "-d" precompilate non erano abbastanzaTuttavia, le librerie di importazione per le librerie dll hanno fatto caricare dal programma le dll precompilate dall'albero dei pacchetti OpenCV, non quelle della mia build con le informazioni .pdb (i percorsi erano simili quindi non ho notato all'inizio). Il percorso dei file .pdb è stato fornito in Strumenti | Opzioni, ma questi file non sono stati caricati a causa della mancata corrispondenza della versione del modulo (ovviamente). Dopo aver copiato le dll corrette e i rispettivi file .pdb nella directory dell'applicazione, il debugger ha iniziato a funzionare all'interno delle funzioni della libreria.

3

Conferma: si sta effettivamente compilando la libreria OpenCV dal sorgente o ci si sta solo collegando a esso?

un paio di possibilità vengono in mente:

Suona come le informazioni di debug per la libreria OpenCV non è disponibile (i file PDB). Potrebbe essere necessario estendere PATH per fare riferimento alla directory contenente questi file. Mi sembra che ci sia un modo per farlo da VC++ ma sono pochi anni fuori dall'utilizzo dello strumento ...

È cvStererCalibrate anche una "funzione macro"? In tal caso, scoprire a quale funzione reale si riferisce e impostare il punto di interruzione nella libreria.

Infine, anche se lo hai già detto, non fa mai male tornare indietro e confermare che il debug completo è stato attivato per tutto il progetto, comprese le librerie esterne.

Non so se questo aiuta, ma è un buon punto di partenza.

+0

Sto solo collegando le librerie opencv statiche. Non riesco a vedere i file .pdb da nessuna parte nell'albero delle biblioteche. Ho pensato che i file speciali del suffisso -d del suffisso includessero già tutte le informazioni necessarie. La funzione non è una macro, ma una normale funzione in stile C. Che tipo di opzione abilita il debugging per le librerie esterne? – neuviemeporte

+0

A meno che le librerie esterne non siano compilate con le informazioni di debug VC++, sarà necessario ricreare la libreria utilizzando VC++ e impostare tutti i flag richiesti per l'utilizzo delle informazioni di debug. Provare a creare un nuovo progetto di lib di VC++ basato sul sorgente OpenCV, compilarlo con le informazioni complete di debug e quindi avere il collegamento del progetto con la nuova libreria OpenCV. – kmontgom

+0

Ok, ci proverò. Per quanto riguarda la differenza tra l'accessibilità delle funzioni cvTerm ... e cvStereo ..., suppongo che sia perché cvTerm è definito in un file di intestazione, non nell'oggetto lib. – neuviemeporte

2

ho avuto gli stessi problemi, che è:

'ccisample.exe': Loaded 'C: \ OpenCV2.1 \ bin \ cv210d.dll'

'ccisample.exe': Loaded ' C: \ OpenCV2.1 bin \ cxcore210d.dll \ '

ho risolto da:

Linker -> Input -> dipendenze aggiuntive aggiungono:' cv210.lib; cxcore210.lib; highgui210.lib;'

anziché aggiungere: 'cv210d.lib; cxcore210d.lib; highgui210d.lib;'

Problemi correlati