2012-02-15 87 views
0

我在这个问题上工作了两天,这让我很生气,因为我对C++还很陌生。这种违规访问问题对您来说可能相当容易,可能会被解答数千次。但是我缺乏C++知识,使我甚至无法确定曾经回答过的同样的问题。这里在调试模式下访问冲突,但在发布模式下很好

确定是我的问题:

的主要代码是一个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库里面,如图下图:

The error occurred in boost lib, not in my code

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

4.此错误仅出现在调试版本中,而不是发布版本中。

5.我用一个旧的但没有错误的版本替换了整个解决方案,该版本在调试模式下正常工作。然而,在我生成此解决方案的发布版本之后,在调试模式下发生错误!

UPDATE:

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

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

希望这个描述将帮助你回忆一些事情,并给我一些提示。

我要问:

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

+1

阅读调用堆栈(屏幕截图中的底部疼痛)通常会有所帮助。它告诉你哪个功能导致了问题。 – 2012-02-15 18:15:46

+0

Visual Studio会在调试模式下执行某些操作,如零内存,并且可能会填充可以隐藏真正内存问题的东西。带箭头指示符的m_position的值是多少? – 2012-02-15 18:17:29

+0

@ToddMurray谢谢!然而,问题是这个代码是boost库的一部分,我认为这个问题不应该是一些编码错误,但一些链接或打破堆栈中的返回地址等太复杂,我不能识别.. – JXITC 2012-02-15 18:20:03

回答

3

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

+0

谢谢你的回答!你的回答是合理的,但是这个NULL指针发生在Boost库代码中,当我创建一个正则表达式对象''时,我不认为我会修改boost源代码? – JXITC 2012-02-15 18:26:34

+0

顺便说一句,我刚刚添加了一个更新,以我的答案为基础,在屏幕截图中我可以看到... – Jason 2012-02-15 18:29:11

+0

MSVC不会将变量初始化为0.它初始化为某些特殊值,如0xcdcdcdcd,但不为0。 – Henrik 2012-02-15 18:32:28

1

它在我看来像“this”(即basic_regex_parser)是NULL,它试图调用一个NULL对象的方法,这显然不能很好地工作。如果“this”确实是NULL(可以通过查看“Locals”选项卡来查看,那么我会调用堆栈到“basic_regex_implementation”级别,看看发生了什么 - 这个NULL值来自哪里?一般来说,查看调用堆栈的不同级别以及这些级别的变量值会有所帮助。

相关问题