c++ visual-studio-2008 static stack-pointer

c++ - La función de llamada salta a la función incorrecta



visual-studio-2008 static (5)

  • Asegúrese de no haber seleccionado en su proyecto una versión anterior de una biblioteca, es decir (como lo mencionó Adam) que ha seleccionado una versión de depuración anterior en lugar de una versión actual o vica versa.

  • Es posible que tengas que reconstruir.

  • También tenga cuidado con la compilación condicional donde una macro podría obtener #defined o # undef''d en algún momento (La otra solución puede tener algunas macros o #defines proyectadas). Algunas veces puede ser útil eliminar su .lib .obj y las memorias caché de encabezado precompiladas con la reconstrucción.

  • Existe una remota posibilidad de que algo esté en mal estado en su IDE o configuración del proyecto, donde podría necesitar recrear su proyecto desde cero.

  • No estoy muy familiarizado con MS VC, ¿puede agregar el archivo de proyecto de la biblioteca desde la otra solución? Por ejemplo, en Borland C ++ Builder puedes definir grupos de proyectos y crear / crear proyectos múltiples, siempre pongo los proyectos para las bibliotecas que uso en mi grupo de proyectos de programa para que todo se actualice cuando construyo.

Estoy compilando una biblioteca estática de c ++ en vs2008, y en la solución también tengo un proyecto de inicio que usa la lib, y eso funciona bien.

Pero cuando uso lib en otra solución obtengo un error de verificación en tiempo de ejecución. "El valor de ESP no se guardó correctamente en una llamada de función" Al pasar por el código noté una función foo () saltando a la barra () justo antes del bloqueo. Las funciones en cuestión son solo funciones regulares y sin punteros a funciones.

Alguien tiene alguna pista de lo que podría estar pasando, y ¿por qué funciona cuando se usa lib''s desde la misma solución?

editar: las funciones (métodos) son parte de una clase, si eso ayuda.


Asegúrese de estar compilando en modo Debug y no en modo Release. Si intenta depurar un programa en modo Release, los datos que obtenga del depurador serán basura debido a las optimizaciones.


Probablemente esto se deba a convenciones de llamadas incompatibles, donde la biblioteca y la persona que llama tienen ideas diferentes sobre el diseño de la pila.

Eche un vistazo a MSDN para obtener más información.


Recuerdo haber visto cosas así cuando la alineación del miembro de la estructura (/ interruptor del compilador Zp) de los binarios era diferente. Usted también puede verificar eso.

Configurarlo a través de #pragma pack en lugar de a través de la configuración del proyecto debería ser más seguro.


Perdónenme por mencionar aquí el sangrado evidente, pero ... He visto este tipo de cosas suceder muchas veces antes cuando los archivos de objeto (.o) y encabezado (.h) se desincronizan. Especialmente con respecto a los métodos virtuales.

Considere: El archivo objeto se compila con el encabezado:

class Foo { virtual void f(); };

Pero luego el encabezado cambia a:

class Foo { virtual void g(); virtual void f(); };

Y para el siguiente archivo objeto, las suposiciones del compilador sobre dónde se encuentra f () en el vtable de la clase son incorrectas.

A menudo, simplemente recompilar el mundo (¡todo!) Ayudará.