OpenSceneGraph C ++ Место чтения нарушения доступа 0x00421000

Работа с OpenSceneGraph, и я продолжаю сталкиваться с этой проблемой нарушения, с которой я был бы признателен за помощь. Проблема в конкретной строке ниже, которая оказывается первой в моей основной функции.

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

У меня есть папка с моими моделями прямо в моем каталоге. Ошибка, как показано ниже.

Необработанное исключение в 0x68630A6C (msvcr100.dll) в OSG3D.exe: 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 недостаточно

1

Решение

введите описание изображения здесь

После тестирования выяснилось, что либо

  • Вы компилируете код в отлаживать режим, но с использованием релиз libs / dlls или
  • Вы компилируете код в релиз режим, но с использованием отлаживать LIBS / библиотек DLL.

Так что просто используйте debug osg lib для отладочной сборки и выпустите версию для сборки выпуска, готово.

введите описание изображения здесь

1

Другие решения

Пожалуйста, сделайте следующее устранение неисправностей:

  1. проверьте, где находится ваша папка Model, предположим, что вы должны скопировать ее в папку debug или release, поскольку они являются путем выполнения по умолчанию.

  2. добавьте некоторый защитный код перед чтением файлов узла, вы должны убедиться, что файл существует, прежде чем читать его.

  3. Присвойте ReaderWriter :: Options напрямую и замените Registry :: instance () -> getOptions () и посмотрите, сохраняется ли проблема.

И я думаю, что «Дизайн по контракту» — это хорошо, чтобы избежать большинства подобных проблем.

0

Мне посчастливилось решить подобные проблемы с помощью таких инструментов, как Application Verifier (от Microsoft). GFlags и подобные инструменты тоже хороши.

Application Verifier легко устанавливается, затем вы указываете его на исполняемый файл и запускаете приложение в Visual Studio. Когда проблема возникает, она ломает приложение, в котором она находит проблему. Это может или не может быть именно там, где возникает проблема (хотя мне посчастливилось приземлиться именно там, где она началась), но должно быть легче увидеть, что может происходить.

Удалось ли вам открыть программу? Microsoft устанавливает его в C: \ Windows \ System32 \ appverif.exe. Когда вы запускаете его, вы выбираете файл, а также то, что вы хотите отладить. В вашем случае выберите параметры памяти. Активируйте App Verifier, и он должен сказать, что теперь вы должны запустить его в Visual Studio. Таким образом, запуск вашей программы в Visual Studio и App Verifier должны помочь остановить вашу программу в том месте, где произошла ошибка (или рядом). Google для проверки приложений. Есть несколько хороших уроков.

0
По вопросам рекламы [email protected]