1

使用 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是不够的

4

3 回答 3

1

在此处输入图像描述

经过测试,发现要么

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

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

在此处输入图像描述

于 2013-12-03T11:26:04.567 回答
0

Please do the following troubleshooting:

  1. check where is your Model folder, suppose you should copy it under debug or release folder, since they are the default execute path.

  2. add some protection code before your read the node files, you must ensure the file exists before you read it.

  3. Construst a ReaderWriter::Options directly and replace Registry::instance()->getOptions() and see if issue is still.

And I think Design by Contract is good to avoid most of this kind of issues.

于 2012-12-04T04:55:33.007 回答
0

通过使用 Application Verifier(来自 Microsoft)等工具,我很幸运地解决了类似的问题。GFlags 和类似的工具也不错。

Application Verifier 安装简单,然后将其指向您的 exe 并在 Visual Studio 中运行该应用程序。当问题发生时,它将破坏发现问题的应用程序。这可能是问题发生的确切位置,也可能不是问题发生的确切位置(尽管我很幸运能在它刚开始的地方着陆),但应该更容易看到可能发生的事情。

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

于 2012-11-29T23:41:59.447 回答