【问题标题】:Access Violation in debug mode, but fine in release mode在调试模式下访问冲突,但在发布模式下很好
【发布时间】:2012-02-15 18:13:34
【问题描述】:

我在这个问题上工作了两天,这让我很生气,因为我对 C++ 还是很陌生。这个违规访问问题对您来说可能很容易,并且可能会被回答数千次。但是由于缺乏 C++ 知识,我什至无法确定曾经回答过的相同问题。

好的,这是我的问题:

1. 主要代码在 DLL 中。我正在使用 Visual Studio 2008

2. 这个 DLL 调用了 3 个外部库:boost、tinyXML 和 SRILM(一个 NLP 工具包)。

3. 错误提示:Unhandled exception at 0x5f4f068f (TextNormalizerAPI.dll) in tester.exe: 0xC0000005: Access violation reading location 0x00000000.,仅在调试模式下发生。错误线是我的代码中初始化了一个boost::regex对象(patUsername = regex("^\\W*@[A-Za-z]");)引起的,但实际位置在boost库的深处,如下图所示:

**在大多数情况下,我不应该更改 Boost lib 的源代码,不是吗? **

4.这个错误只出现在Debug版本,不在Release版本。

5. 我将整个解决方案替换为在调试模式下正常工作的旧但无故障版本。然而,在我生成此解决方案的发布版本后,在调试模式下立即发生错误!

更新:

6.谢谢你们!我刚刚尝试了一些东西,发现即使在DLL条目的第一行简单地定义一个正则表达式对象也会导致这个错误!有任何想法吗?

7.但是在这个dll的调用者的main()的第一行初始化一个正则表达式对象不会引起这个问题。

希望这个描述能帮助你回忆一些东西并给我一些提示。

我想问:

缩小范围和发现问题的常用策略是什么?谢谢!

【问题讨论】:

  • 阅读调用堆栈(屏幕截图中的底部痛点)通常会有很大帮助。它会告诉您是哪个函数导致了问题。
  • Visual Studio 将在调试模式下执行诸如将内存归零之类的事情,并且可能会填充可以隐藏真正内存问题的事情。有箭头指示符所在行的 m_position 的值是多少?
  • @ToddMurray 谢谢!然而问题是这段代码是boost库的一部分,我认为问题不应该是一些编码错误,而是一些链接或破坏堆栈中的返回地址等太复杂了,我无法识别..
  • @JXITC:我们看到调试器在 boost 代码中中断,但这通常意味着您的代码具有未定义的行为,即未初始化或其他 NULL 指针。在调试中,MSVC 足够聪明地捕捉到它,但在发布时,它只是默默地失败(为了速度)。

标签: c++ boost access-violation release-mode


【解决方案1】:

查看您的代码,您可能想要验证您的 m_position 值是否有效......我在您的代码中看到了 escape_type_class_jump 标签,因此 goto 或您使用的任何机制跳转到该标签(我无法从屏幕截图中看出)可能会绕过正在执行的任何检查以验证您的位置增量是否仍然有效。

【讨论】:

  • 感谢您的热心回答!你的回答是合理的,但是这个 NULL 指针出现在 Boost 库代码中,在我创建正则表达式对象时从我的代码中调用 patUsername = regex("^\\W*@[A-Za-z]"); 所以我认为我不会修改 boost 源代码?
  • 顺便说一句,我刚刚根据我在该屏幕截图中看到的内容对我的答案添加了更新...
  • MSVC 不会将变量初始化为 0。它会初始化为一些特殊值,例如 0xcdcdcdcd,但不会初始化为 0。
  • 谢谢@Jason:我刚刚尝试了一些东西,发现即使在 main() 的第一行简单地定义一个正则表达式对象也会导致这个错误!?
  • @JXITC:您是否正确初始化了对象?例如,必须有一个字符串来解析 ...
【解决方案2】:

在我看来,“this”(即 basic_regex_parser)为 NULL,并且它试图调用 NULL 对象上的方法,这显然不能正常工作。如果“this”确实为 NULL(您可以通过查看“Locals”选项卡来判断,那么我会将调用堆栈提升到“basic_regex_implementation”级别并查看那里发生了什么——这个 NULL 值来自哪里?通常,查看调用堆栈的不同级别以及这些级别中的变量值会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多