es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Depurar el código de encabezado MFC no funciona con Visual Studio 2019.

TL;DR: Depuración “en” el código de cabecera MFC (CString) no funciona en ambas de mis máquinas y según lo que puedo ver, esto se debe a la forma peculiar en que se compilan estos encabezados.

Atravesar el código de cabecera MFC cuando se ingresa a través del desensamblador funciona, pero la configuración de puntos de interrupción no funciona.

Estoy buscando una solución alternativa o al menos el reconocimiento de mi análisis.

Sistema:

  • Visual Studio 2019 Professional 16.9.6
  • Windows 10 / 1809 Enterprise LTSC

Configuración: (Lo siento por ser bastante largo)

  • Cree un proyecto de aplicación MFC de ejemplo de Visual Studio 2019 (aplicación SDI)
  • Asegúrese de que Habilitar solo mi código está desactivado en Opciones -> Depuración -> General.
  • Establezca la configuración de compilación en Debug/x64 (no hace ninguna diferencia, pero mantengamos a todos en la misma página)
  • Vaya a MFCApplication1.cpp -> CMFCApplication1App::InitInstance()
  • Inserte una inicialización de CString como esta:


    InitCommonControlsEx(&InitCtrls);

    CWinAppEx::InitInstance(); // por favor, ponga el breakpoint 1 aquí

    // Agregue esta línea y establezca puntos de interrupción
    CString this_is_text(L"¡La depuración en el encabezado CString no funciona!"); // breakpoint 2 aquí

Ahora, puede iniciar el programa con el depurador y debería detenerse en el primer punto de interrupción:

https://i.stack.imgur.com/RAFoj.png

Ahora, asegúrese de que todos los símbolos estén cargados, más fácilmente a través de la pila de llamadas:

https://i.stack.imgur.com/o5b66.png

Simplemente seleccione todas las líneas en la ventana de la pila de llamadas y presione Cargar símbolos en el menú contextual. Después de esto, la pila de llamadas debe verse más o menos así:

     MFCApplication1.exe!CMFCApplication1App::InitInstance() Line 75 C++
    mfc140ud.dll!AfxWinMain(HINSTANCE__ * hInstance=0x00007ff7b5070000, ...) Line 37    C++
    MFCApplication1.exe!wWinMain(HINSTANCE__ * hInstance=0x00007ff7b5070000, ...) Line 26   C++
    MFCApplication1.exe!invoke_main() Line 123  C++
    MFCApplication1.exe!__scrt_common_main_seh() Line 288   C++
    MFCApplication1.exe!__scrt_common_main() Line 331   C++
    MFCApplication1.exe!wWinMainCRTStartup(void * __formal=0x000000c2b7084000) Line 17  C++
    kernel32.dll!BaseThreadInitThunk()  Desconocido
    ntdll.dll!RtlUserThreadStart()  Desconocido

Ahora, puede intentar  atravesar  (posiblemente F11) la función CWinAppEx::InitInstance(), lo que debe funcionar sin problemas, llevándolo a mfc140ud.dll!CWinApp::InitInstance() Line 394 – esto está bien.

Salga de allí y luego intente ingresar a la función del constructor CString:

https://i.stack.imgur.com/Mc5C3.png

Esto NO funciona en mis máquinas.

Lo que puedo hacer, desde el punto anterior, es cambiar a la vista de desensamblador, ingresar a las llamadas allí y entrar en el código del encabezado de esta manera:

https://i.stack.imgur.com/VAkiw.png

Puedo atravesar con éxito (pero nunca ingresar) el código de encabezado MFC. Intentar establecer un punto de interrupción dará como resultado el siguiente error:

El punto de interrupción actualmente no se activará. No se asocia ningún código ejecutable del tipo de código del depurador con esta línea. > Las causas posibles incluyen …

C: \ Program Files (x86) \ Microsoft Visual Studio \ 2019 \ Professional \ VC \ Tools \ MSVC \ 14.28.29910 \ atlmfc \ include \ cstringt.h

https://i.stack.imgur.com/LilwD.png

Y aquí es donde estoy.

Análisis:

Lo que podemos ver del código MFC es que podemos ingresar al código cpp “regular”, pero tan pronto como intentamos ingresar (o configurar una interrupción) en el código que está dentro de esta cabecera CStringt.h , se rompe.

Curioso aquí: este es un código de cabecera de plantilla y aún así el código ejecutado (como se muestra por el desensamblador) no está en el módulo de usuario, sino en el mfc###.dll! Creo que hacen algunos trucos inteligentes con el preprocesador (ver defined(_MFC_DLL_BLD) y algo por el estilo), lo que permite este uso múltiple del archivo de encabezado y tal vez, posiblemente, eso también es lo que rompe el depurador.

Pregunta:

  • ¿Es este un problema conocido, esto sucede con todas las instalaciones de VS2019, hay algo peculiar en mi configuración?
  • ¿Quizás solucionado en una versión de VS más nueva?
  • Si efectivamente está roto, ¿cuál sería una solución alternativa utilizable, aparte de cambiar constantemente a la vista de desensamblador cuando se utilizan los encabezados MFC?

La respuesta más interesante aquí sería la razón por la cual esto falla, ¿dónde se confunde el depurador? ¿Es este un problema general con el redefinir el código al depurar el código de la biblioteca?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como experto en informática especializado en c++, Visual Studio, depuración, MFC y PDB, el problema que se presenta es que la depuración en el código principal de MFC (CString) no funciona en ninguna de las dos máquinas del autor, y hasta donde pueden notar, esto se debe a la manera peculiar en que se compilan estos encabezados. El autor está buscando una solución alternativa o al menos reconocimiento de su análisis.

    El autor ha realizado una serie de pasos, como crear un proyecto de aplicación de ejemplo de MFC en Visual Studio 2019 (SDI App) y establecer la configuración de compilación a Debug/x64. Al intentar depurar el constructor de CString, el depurador no puede hacerlo. Cambiando a la vista del desensamblador permite al autor seguir el código principal de MFC, pero aún es incapaz de establecer puntos de interrupción o depurarlos.

    El autor cree que puede haber algunos trucos clever con el preprocesador que pueden estar causando el problema. Se pregunta si este es un problema conocido y si ocurre con todas las instalaciones de VS2019, o si ha sido corregido en una versión más nueva de Visual Studio. Además, el autor está interesado en posibles soluciones alternativas y por qué se produce este problema.

Comments are closed.