访问冲突错误后VS2008 C ++断点变为永久不活动(没有与行关联的可执行代码)

时间:2016-11-10 13:43:45

标签: c++ visual-studio-2008 breakpoints visual-studio-debugging

我在VS2008(原生C ++)中重现了以下行为:

  • 附加到使用自定义dll(我有源代码)的可执行文件
  • 调试动态库中的代码
  • 遇到访问冲突错误(可能是由可执行文件中的代码引起的 - 闭源)
  • 使用附加的调试器中断访问冲突错误

在此之后,无论我重新连接多少次,重建,重新启动应用程序,计算机,我将在.dll源代码中设置的任何断点都变为非活动状态(没有与此行关联的可执行代码据VS说,这是所谓的原因。

我怀疑这是VS2008的一个问题,因为我在另一台机器上做了同样的事情,现在我有两台机器无法进行调试。

此问题是否有任何记录解决方案?可以做些什么来克服它?

我做了什么:

  • 删除所有内容(整个解决方案,pdbs,二进制文件等),从头开始编写代码(从存储库中克隆最新版本)
  • 重启机器
  • 更换机器(它工作一次,直到发生错误,然后另一台计算机表现出相同的行为)

我不能做的事情:

  • 更改编译器/ VS版本
  • 调试可执行文件(遗憾的是没有可用的源代码和缺乏组装技能)

1 个答案:

答案 0 :(得分:0)

问题的根源更加微妙。虽然该项目是原生C ++,但我发现在测试代码的配置中,整个项目都是使用CLR支持构建的。

首次在任何计算机上连接到应用程序时,在本机调试模式下,将触发断点。但是,遇到本机访问冲突错误时,这些断点此后变为永久不活动。在决定检查调试器是否在自动模式下连接后会发生什么情况后,我发现断点变为活动状态,因此发现所有代码都使用/ clr标志编译,除了用于入口点在消耗的dll中,没有CLR支持。

这里的问题是为什么VS2008的行为与此类似,并且在尝试使用本机调试设置调试托管上下文时不会直接禁用断点。

TL; DR:检查您的C ++项目是否构建了CLR支持,并根据您的需要将其作为本机或托管附加。或者,如果只有部分文件需要使用C ++ - CLI,则只为这些文件启用/ clr标志。它通常是更好的选择,因为C ++ - CLI经常与某些本机库冲突(例如,不支持std :: mutex,链接本机静态库Linking unmanaged C++ DLL with managed C++ class library DLL等。)。