Visual Studio 2017 声称我正在调试我的 C++/CLI 项目的发布版本

3
从Visual Studio 2013升级到Visual Studio 2017后,如果我尝试启动我的C++/CLI项目(.vcxproj项目文件)的调试会话,Visual Studio会停止并显示一个对话框,其中写着:
“您正在调试Foo.exe的Release版本。使用Just My Code与使用编译器优化的Release版本会导致调试体验下降(例如,断点将不会被命中)。”
然后我可以选择停止调试或继续调试会话,无论“Just My Code”是否打开。
该项目显然是使用Debug信息构建的,并且没有进行任何优化。因此,旧版的Visual Studio 2013没有显示任何警告。
这两个SO问题(链接)(链接)处理了由Visual Studio 2015发出的相同警告,但是在阅读了那里提供的建议和提示后,我必须说,它们中没有一个似乎是解决我的问题的令人信服的解决方案。具体而言,我曾经通过启用Visual Studio选项“Suppress JIT optimization on module load (Managed only)”来摆脱警告,但我认为这只是治标不治本。
我应该怎么做才能让Visual Studio 2017检测到我的C++/CLI项目是一个调试版本,以便它不再显示令人烦恼(实际上是误导性的)的警告?
环境:
- Visual Studio 2017 Version 15.5.2 - Visual Studio选项“Just My Code”已启用 - Visual Studio选项“Suppress JIT optimization on module load (Managed only)”已禁用 - 项目是一个本机项目(.vcxproj项目文件),支持CLR(编译器选项/CLR),带有调试信息(链接器选项/DEBUG),并且没有进行任何优化(编译器选项/Od)

1
VS2017 15.5.x是一个非常糟糕的错误集合,但他们破坏了这个也有点牵强。只需确保启用了传统的调试引擎,这对于任何C++/CLI代码都是必需的。工具 > 选项 > 调试 > 通用,“使用托管兼容模式”必须被勾选。 - Hans Passant
1个回答

1
我的问题的解决方案是将项目设置为“可调试程序集”(链接器选项/ASSEMBLYDEBUG设置为“Yes”)。默认情况下,此链接器选项未设置,显然默认为/ASSEMBLYDEBUG:DISABLE。请参考微软的链接器选项文档
/ASSEMBLYDEBUG设置为与编写以下内容相同:
[assembly:Debuggable(true, true)];

在编码中,根据MSDN文档的DebuggableAttribute构造函数,该代码告诉调试器设置:

  • isJITTrackingEnabled = true
  • isJITOptimizerDisabled = true

因此,在问题中提到的初始解决方法,即启用Visual Studio选项“在模块加载时抑制JIT优化(仅托管)”,并不是太偏离轨道。但我认为,了解自己在做什么并设置细粒度的、项目特定的链接器设置比完全不知所措并随意更改全局Visual Studio设置要好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接