2011-03-03 13 views
10

Estoy trabajando en un problema bastante complicado que he estado en, literalmente, de una semana. He golpeado una pared muy dura y me duele la frente por golpearla, así que espero que alguien me pueda ayudar.Crash cuando se ejecuta la aplicación debido a la existencia de código no ejecutado en el archivo de origen - C++

Estoy utilizando Visual Studio 2005 para este proyecto - He instalado 2008, pero estaba corriendo en problemas similares cuando lo probé.

tenemos una aplicación que actualmente trabajan compilado con OpenCv1.1 y yo estoy tratando de actualizar a 2.2. Cuando cambiamos de forma estática al enlace a las nuevas bibliotecas, la aplicación falla, pero solo en el modo de lanzamiento. Por lo tanto, el enlace dinámico y la depuración funcionan bien.

El bloqueo está en std::vector al llamar al push_back.

Entonces me encontré con una aplicación de prueba de ejemplo que se ejecuta un código básico en OpenCV que funciona muy bien y luego tomó ese mismo código y lo añadió a nuestra aplicación. Ese código falla.

entonces destripado la aplicación por lo que no instanciar objetos de código, excepto la interfaz gráfica de usuario principal y 1 clase que llama ese código y todavía se estrelló. Sin embargo, si ejecuté ese código directamente en la GUI principal, funcionó bien.

luego empecé comentando enormes cantidades de la aplicación (en componentes que nunca debe ser instanciados) y, finalmente, me abrí camino hacia abajo, abajo, abajo hasta que ...

tengo una clase que tiene un método

void Foo() 
{ 
    std::vector<int> blah; 
    blah.begin(); 
} 

Si este método se define en el encabezado, el código de prueba funciona, pero si este código se define en el archivo cpp, se bloquea. Además, si uso std::vector<double> en lugar de int, también funciona.

Luego intenté jugar con las opciones del compilador y si tengo las optimizaciones desactivadas (/ Od) y Expansión de la función en línea configurada en Sólo __inline (/ Ob1) funciona incluso con el código en el archivo cpp.

Por supuesto, si volvemos a la aplicación con vísceras y cambiar las opciones del compilador por sí mismos, de que se estrelle.

Si alguien tiene alguna idea sobre esto, hágamelo saber.

Gracias, Liron

+0

Cuando paso a través de él con el depurador es el programa capaz de cargar por completo o qué se cuelga antes de que incluso llega a principal (o WinMain)? Su problema es interesante porque, en general, considero que la vinculación dinámica es más problemática que la vinculación estática con los tiempos de ejecución – greatwolf

+0

El programa se carga completamente bien. Luego presiono un botón en la interfaz gráfica (Qt) que ejecuta el código llamando a opencv. Si el código está allí en el botón, presione, funciona, pero si el código es llamado desde otra clase, se bloquea. – Liron

+0

Actualicé el proyecto para no crear una GUI en absoluto y todavía se cuelga una vez que llamo al código de OpenCV. – Liron

Respuesta

8

ARGH! Solución resuelta.

En nuestra solución que habíamos definido _SECURE_SCL = 0, pero en las bibliotecas 3 ª parte tuvimos la construcción, que es indefinida (lo que significa = 1). Establecer _SECURE_SCL en 0 supuestamente reduce los tiempos de ejecución drásticamente, pero tiene que hacerse de la misma manera en todas las librerías incluidas, de lo contrario tratarán los tamaños de las matrices de forma diferente.

http://msdn.microsoft.com/en-us/library/aa985896%28v=vs.80%29.aspx

Eso fue una semana divertida.

6

Las clases STL, como vector de <>, tienen una falta de correspondencia entre el diseño y la liberación versiones de depuración, causada por el apoyo iterador depuración. Su problema se comporta exactamente como el tipo de problema que tiene cuando vincula una compilación de depuración de .lib o DLL en la versión de lanzamiento de su aplicación e intercambia un objeto STL entre ellos. El resultado es la corrupción de montón y las excepciones de violación de acceso.

Comprueba tres veces la configuración de compilación y asegúrate de que solo vinculas la versión de lanzamiento de .libs en tu compilación Release y la compilación de depuración de .libs en tu compilación Debug.

+0

+1. Solo para agregar una posibilidad: mezclar DLL/EXE enlazados estáticamente con enlaces dinámicos y pasar punteros sin que lleven la información de cómo pueden destruirse correctamente. – 0xC0000022L

+0

Deberíamos estar haciendo todo dinámicamente. – Liron

+0

Las bibliotecas que estamos incluyendo son: Imm32.lib QtCore.lib QtGui.lib QtMain.lib QtNetwork.lib QtOpenGL.lib QtXml.lib Vfw32.lib WinMM.lib comctl32.lib glu32.lib libjasper.lib libjpeg.lib libpng Lib libtiff.lib opencv_calib3d220.lib opencv_contrib220.lib opencv_core220.lib opencv_features2d220.lib opencv_ffmpeg220.lib opencv_flann220.lib opencv_gpu220.lib opencv_haartraining_engine.lib opencv_highgui220.lib opencv_imgproc220.lib opencv_lapack.lib opencv_legacy220.lib opencv_ml220.lib opencv_objdetect220.lib opencv_video220.lib ws2_32.lib qjpeg.lib Además, estamos enlazando boost, que debería manejar esto – Liron

0

podría intentar:

void Foo() 
{ 
    std::vector<int> blah; 
    blah.reserve(5); 
    blah.begin(); 
} 
+0

Añadir reserva (5) no hace ninguna diferencia. Aún se bloquea. El código en esa función nunca se ejecuta de todos modos (al menos el depurador nunca lo golpea). – Liron

+0

@LKIM luego prueba std :: vector blah (5); – fazo

+0

Solíamos tener eso, todavía causaba un bloqueo: - \. El código anterior era solo para mí, reduciendo al mínimo posible, pero eso solía ser parte de una función que hacía mucho más. – Liron

Cuestiones relacionadas