访问违反错误后,VS2008 c++断点永久不活动(没有与行相关的可执行代码)

VS2008 C++ breakpoint becomes permanently inactive after access violation error (no executable code associated with line)

本文关键字:代码 可执行 不活动 错误 VS2008 断点 c++ 访问      更新时间:2023-10-16

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

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

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

我怀疑这是VS2008的问题,因为我在另一台机器上做了同样的事情,现在我有两台机器不再可能调试了。

有记录的解决这个问题的方法吗?怎样才能克服它呢?


我做了什么:

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

我不能做的:

  • 调试可执行文件(遗憾的是没有可用的源代码和缺乏汇编技能)

问题的根源更为微妙。虽然这个项目是打算使用本地c++的,但我发现在我测试代码的配置中,整个项目是用CLR支持构建的。

当在任何机器上第一次附加到应用程序时,在本机调试模式下,断点将被触发。但是,当遇到本机访问冲突错误时,这些断点从此永久不活动。在决定检查如果我让调试器在自动模式下附加会发生什么之后,我发现断点变得活跃,因此发现所有代码都用/clr标志编译,除了用于消耗的dll中的入口点,它没有clr支持。

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


TL;DR:检查您的c++项目是否使用CLR支持构建,并根据您的需要附加为本机或托管。或者,如果只有一些文件需要使用c++ -CLI,那么只为这些文件启用/clr标志。这通常是一个更好的选择,因为c++ -CLI经常与某些本机库冲突(例如,不支持std::mutex,链接本地静态库,将非托管c++ DLL与托管c++类库DLL链接,等等)。

相关文章: