【发布时间】:2022-01-07 22:40:19
【问题描述】:
TL;DR:调试到 MFC (CString) 标头代码在我的机器上和两台 上都不起作用,就我而言可以看出这是由于这些头文件的特殊编译方式。
通过反汇编输入时单步执行 MFC 标头代码有效,但设置 brealpoints 无效。
我正在寻找解决方法或至少确认我的分析。
系统:
- Visual Studio 2019 专业版 16.9.6
- Windows 10 / 1809 企业版 LTSC
设置:(我很抱歉这太长了。)
-
创建 Visual Studio 2019 示例 MFC 应用程序项目(SDI 应用程序)
-
确保
Enable Just My Code在选项 -> 调试 -> 常规下关闭。 -
将构建配置设置为 Debug/x64(没有区别,但让我们都留在同一页面上)
-
导航到
MFCApplication1.cpp->CMFCApplication1App::InitInstance() -
像这样插入一个 CString 初始化:
... InitCommonControlsEx(&InitCtrls); CWinAppEx::InitInstance(); // please put breakpoint 1 here // Add this line and set breakpoints CString this_is_text(L"Debugging into CString Header does not work!"); // breakpoint 2 here
现在,你可以在调试器下启动程序了,你应该在第一个断点处停止:
现在,确保所有符号都已加载,最简单的方法是通过调用堆栈完成:
只需选择调用堆栈窗口中的所有行,然后在上下文菜单中点击加载符号。之后调用堆栈大致如下所示:
> 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() Unknown
ntdll.dll!RtlUserThreadStart() Unknown
现在,您可以尝试 stepping-into(可能是 F11)CWinAppEx::InitInstance() 功能,它应该工作没有问题,让您登陆mfc140ud.dll!CWinApp::InitInstance() Line 394 - 这个没问题。
再次退出,然后尝试进入CString ctor:
这在我的机器上不起作用!
我可以做的是(从上面的观点)切换到反汇编视图,进入calls 并以这种方式进入标题代码:
然后我可以成功地单步执行(但永远不会进入)MFC 标头代码。尝试设置断点会报错:
当前不会命中断点。没有调试器代码类型的可执行代码与此行相关联。 可能的原因包括...
C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.28.29910\atlmfc\include\cstringt.h
这就是我所在的地方。
分析:
我们可以从 MFC 代码中看到,我们可以进入“常规”cpp 代码,但只要我们尝试进入(或设置断点)此 @ 内的代码987654342@它坏了。
这里很奇怪:这是模板header代码,但执行的代码(如反汇编所示)仍然不在用户模块中,而是在mfc###.dll!我认为他们对预处理器做了一些聪明的技巧(参见defined(_MFC_DLL_BLD) 和一些类似的东西),这使得头文件的这种多用途成为可能,也许这也是破坏调试器的原因。
问题:
- 这是一个已知问题吗?所有 VS2019 安装都会出现这种情况吗?我的设置有什么特殊之处吗?
- 也许在较新的 VS 版本中已修复?
- 如果这确实被破坏了,除了在进入 MFC 标头时不断切换到反汇编视图之外,还有什么可用的解决方法。
这里最有趣的答案实际上是关于为什么会中断 - 调试器在哪里感到困惑?这是调试库代码时 re-define-ing 代码的普遍问题吗?
【问题讨论】:
-
Martin,您在使用 Visual Assist 吗?如果是,则任何解决方案都不起作用。即使您不使用 Visual Assist,其中一些也无法工作。
-
@JohnCz - 是的,我们使用 VSAssist。不确定该工具将如何获得报酬。但是调试器中的断点。你的评论有太多的负面影响。我没有解析所有的...不是;-P
标签: c++ visual-studio debugging mfc pdb