Visual Studio 2017 声称我正在调试我的 C++/CLI 项目的发布版本
Posted
技术标签:
【中文标题】Visual Studio 2017 声称我正在调试我的 C++/CLI 项目的发布版本【英文标题】:Visual Studio 2017 claims I am debugging a release build of my C++/CLI project 【发布时间】:2018-01-05 17:31:10 【问题描述】:从 Visual Studio 2013 更新到 Visual Studio 2017 后,如果我尝试启动 C++/CLI 项目(.vcxproj 项目文件)的调试会话,Visual Studio 会停止并显示一个对话框,其中显示:
您正在调试 Foo.exe 的发布版本。将 Just My Code 与使用编译器优化的 Release 构建一起使用会导致调试体验下降(例如,不会命中断点)。
然后我可以停止调试或继续调试会话,可以打开或关闭“仅我的代码”。
该项目显然是使用调试信息构建的,没有任何优化。因此,旧的 Visual Studio 2013 没有显示任何警告。
this SO question 和 this SO question 都处理 Visual Studio 2015 发出的相同警告,但在阅读了那里提供的建议和提示后,我不得不说它们似乎都不是我的问题的令人信服的解决方案。具体来说,我能够通过启用 Visual Studio 选项“在模块加载时抑制 JIT 优化(仅限托管)”来消除警告,但我认为这只是治疗症状,而不是修复问题的实际原因。
我必须做些什么才能让 Visual Studio 2017 检测到我的 C++/CLI 项目是调试版本,以便它不再显示烦人的(实际上是误导性的)警告?
环境:
Visual Studio 2017 版本 15.5.2 Visual Studio 选项“仅我的代码”已启用 Visual Studio 选项“在模块加载时抑制 JIT 优化(仅限托管)”已禁用 项目是使用 CLR 支持(编译器选项/CLR
)、调试信息(链接器选项 /DEBUG
)和无优化(编译器选项 /Od
)构建的本机项目(.vcxproj 项目文件)
【问题讨论】:
VS2017 15.5.x 是一个非常糟糕的错误包,但他们也打破了这一点有点牵强。只需确保您启用了任何 C++/CLI 代码所需的旧版调试引擎。工具 > 选项 > 调试 > 常规,必须勾选“使用托管兼容模式”。 【参考方案1】:我的问题的解决方案是需要在项目设置“可调试程序集”设置为“是”的情况下构建项目(链接器选项/ASSEMBLYDEBUG
)。默认情况下,此链接器选项未设置,显然默认为/ASSEMBLYDEBUG:DISABLE
。参照。微软的documentation of the linker option。
设置/ASSEMBLYDEBUG
和写一样
[assembly:Debuggable(true, true)];
在代码中。根据这个DebuggableAttribute构造函数的MSDN documentation,这段代码告诉调试器去设置
isJITTrackingEnabled = true isJITOptimizerDisabled = true因此,我在问题中提到的初始解决方法是启用 Visual Studio 选项“在模块加载时抑制 JIT 优化(仅限托管)”,并没有偏离轨道太远。但我相信,知道自己在做什么并设置一个细粒度的、特定于项目的链接器设置,总比不知道并随机更改全局 Visual Studio 设置要好。
【讨论】:
以上是关于Visual Studio 2017 声称我正在调试我的 C++/CLI 项目的发布版本的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server 生成 Visual Studio 声称是错误的代码?
Visual Studio 2017“无法连接到 Web 服务器 'IIS Express'”
Visual Studio 中基于 For 循环的 C++17 广义范围
Visual Studio 20周年,我和VS不得不说的故事(内含福利)