【发布时间】: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