OpenSceneGraph C ++访问冲突读取位置0x00421000

时间:2012-11-07 08:32:45

标签: c++ openscenegraph

使用OpenSceneGraph,我一直遇到这个违规问题,我将不胜感激。问题在于下面的特定行恰好是我主要功能中的第一行。

 osg::ref_ptr<osg::Node> bench = osgDB::readNodeFile("Models/test.IVE");

我的模型文件夹位于我的目录中。错误如下。

OSG3D.exe中0x68630A6C(msvcr100.dll)的未处理异常:0xC0000005:访问冲突读取位置0x00421000。

这就是问题似乎即将到来的地方。

/** Read an osg::Node from file. 
  * Return valid osg::Node on success,
  * return NULL on failure.
  * The osgDB::Registry is used to load the appropriate ReaderWriter plugin
  * for the filename extension, and this plugin then handles the request
  * to read the specified file.*/
inline osg::Node*  readNodeFile(const std::string& filename)
{
    return readNodeFile(filename,Registry::instance()->getOptions());
}

我希望将来能够最好地解决此类异常消息的详细信息。是否有工具可以轻松调试或有方法捕获确切的问题并修复它们?我很感激任何帮助。

我的最终目标是学习如何更好地调试C ++相关问题。有了它,这意味着通过编译器错误列表http://msdn.microsoft.com/en-us/library/850cstw1(v=vs.71).aspx读取是不够的

3 个答案:

答案 0 :(得分:1)

enter image description here

经过测试,发现

  • 您正在调试模式下编译代码,但使用发布 libs / dlls或
  • 您正在发布模式下编译代码,但使用 debug libs / dlls。

因此,只需使用debug osg lib进行调试构建,然后发布版本进行发布构建,完成。

enter image description here

答案 1 :(得分:0)

我通过使用Application Verifier(来自Microsoft)等工具解决类似问题,祝你好运。 GFlags和类似的工具也很好。

Application Verifier安装简单,然后将其指向您的exe并在Visual Studio中运行该应用程序。当问题发生时,它将破坏发现问题的应用程序。这可能是也可能不是问题的确切位置(虽然我在第一次开始的时候有好运,但是应该更容易看到可能发生的事情。

你能打开这个程序吗? Microsoft将其安装在C:\ Windows \ System32 \ appverif.exe中。运行它时,选择文件以及要调试的内容。在您的情况下选择内存相关的选项。激活App Verifier,它应该告诉您现在应该在Visual Studio中运行它。因此,在Visual Studio中运行程序,App Verifier应该有助于在发生错误(或附近)的位置停止程序。 Google for Application Verifier。有一些很好的教程。

答案 2 :(得分:0)

请执行以下问题排查:

  1. 检查Model文件夹的位置,假设您应该将它复制到debug或release文件夹下,因为它们是默认的执行路径。

  2. 在读取节点文件之前添加一些保护代码,在阅读之前必须确保该文件存在。

  3. 直接构建ReaderWriter :: Options并替换Registry :: instance() - &gt; getOptions()并查看问题是否仍然存在。

  4. 我认为按合同设计可以避免大部分此类问题。