1

我们得到了一个 CLI Wrapper,它使用了另一个团队编写的 C++ 代码。由于一些版本的源代码更改非常大,我们会从 CLI 中随机获得 AccessViolationExceptions。它完全是随机的,我们试图弄清楚在什么情况下会发生异常 - 没有成功。

堆栈跟踪如下:

at QDataStream.{ctor}(QDataStream* , QByteArray* , QFlags<enum QIODevice::OpenModeFlag>* )
at XMLParsers.privGetCheckSumOf(XMLParsers* , ParameterManager* PM, ActiveFlag Active) 
at XMLParsers.Set_XMLStream(XMLParsers* , QXmlStreamWriter* pXSW, ParameterManager* PM, ActiveFlag Active)
at XMLParsers.ExportToExchangeFormat(XMLParsers* , QString* , ParameterManager* PM, ActiveFlag Active)
at XMLParsers.ExportToXML(XMLParsers* , basic_string<char\,std::char_traits<char>\,std::allocator<char> >* , ParameterManager* PM, ActiveFlag Active)
at ParameterManager.GetExchangeFormat(ParameterManager* , basic_string<char\,std::char_traits<char>\,std::allocator<char> >* , ActiveFlag Active)

我的第一步是在使用 QDataStream 时在 Internet 上搜索异常 - 但我没有找到任何异常。所以我现在担心的是一些内部指针被破坏了。唯一奇怪的是,这个异常只是在给定相同输入的情况下随机发生。(约占所有呼叫的 1-2%)

无论如何,在这里发布原始源代码会太多了——在 C++ 代码中调用的代码行有几千行,所以我在这里的主要问题不是异常起源于哪一行,而是如何(通常)我们可以缩小这个 AccessViolationException。

  • 您会推荐哪种内存分析工具?我假设对上面 QDataStream 的调用不是这个异常的原因,我认为这只是可以检测到(类的已经无效状态)的部分。
  • 我可以从 AccessViolationException 获得更多信息吗?目前,我的应用程序崩溃了,我只能从 Windows 事件日志中获取堆栈跟踪。
  • 任何其他提示我们可以在 CLI 中检查/更改以找出此异常的详细信息?

感谢您提供任何帮助,因为我们在搜索了很多天(和几个晚上..)后对这个错误感到绝望。

4

0 回答 0