繁体   English   中英

在调试模式下访问冲突,但在发布模式下很好

[英]Access Violation in debug mode, but fine in release mode

我在这个问题上工作了两天,这使我发疯,因为我对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]");patUsername = regex("^\\\\W*@[A-Za-z]");的初始化引起的,但实际位置很深boost库,如下图所示:

错误发生在boost lib中,不在我的代码中

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

4.仅在Debug版本中发生此错误,在Release版本中未发生。

5.我将整个解决方案替换为一个旧但无故障的版本,该版本在Debug模式下可以正常工作。 但是,在生成此解决方案的发行版之后,立即在调试模式下发生了错误!

更新:

6.谢谢大家! 我只是尝试了一下,发现即使在DLL条目的第一行中简单定义一个regex对象也会引起此错误! 有任何想法吗?

7.尚未在此dll调用者的main()的第一行中初始化正则表达式对象,将不会引起此问题。

希望此描述可以帮助您回忆一些事情并给我一些提示。

我想问问:

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

查看您的代码,您可能需要验证您的m_position值是否有效……我在您的代码中看到一个escape_type_class_jump标签,因此goto或您用来跳转到该标签的任何机制(我不能从屏幕截图中判断)可能会绕过正在执行的任何检查,以验证您的位置增量仍然有效。

在我看来,“ this”(即basic_regex_parser)为NULL,并且它试图在NULL对象上调用方法,这显然不能很好地工作。 如果“ this”确实为NULL(您可以通过在“ Locals”选项卡中查找来判断,那么我会将调用堆栈上移至“ basic_regex_implementation”级别,然后查看发生了什么-NULL值从何而来?通常,查看调用堆栈的不同级别以及这些级别中的变量值将很有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM