访问违反错误后,VS2008 c++断点永久不活动(没有与行相关的可执行代码)
VS2008 C++ breakpoint becomes permanently inactive after access violation error (no executable code associated with line)
我正在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链接,等等)。
相关文章:
- 当前不会命中断点。没有调试器目标代码类型的可执行代码与此文件关联
- 运行自定义可执行文件,QProcess 立即退出,退出代码为 1
- 如何在 Azure 应用服务中使用 cl.exe 编译 C++ 代码并生成可执行文件
- 来自C++代码的独立可执行文件
- C++模板的对象代码是否在可执行文件和动态库中重复?
- 如何使用可执行文件将我的C++代码合并到我的 Xcode 项目中
- Bash 代码,仅在当前可执行文件完成运行时在循环中运行可执行文件
- 通过创建单个线程来运行一段代码可加快执行速度
- 如何在C++代码中使用 SVM Light?(可能无需从C++代码调用可执行文件)
- 为什么将可执行文件重命名为临时文件的此代码段不能按预期工作?
- DLL仅在可执行依赖项中缺少DLL_Process_attach中的代码
- 如何将可执行文件转换为 C++ 文件以达到代码峰值
- C++ 在代码中更改输出可执行文件名称
- 使用大多数Java代码制作可执行文件,但可能添加了其他语言
- 使用 CMake 将资源(例如着色器代码、图像)嵌入到可执行文件/库中
- 在matlab中调用可执行函数,速度比原生matlab代码慢
- 如何使用c++执行附加在可执行文件末尾的机器代码
- 可移植可执行文件是否可以直接绝对引用代码段中的外部库,而不是通过 IAT
- Visual Studio 2012 C++代码覆盖率合并可执行文件
- 如何在编译过程中编辑可执行文件,而不更改其源代码