Режим выпуска работает нормально, но режим отладки дает необработанное исключение — использование Octave DLL

Режим выпуска работает нормально, но режим отладки дает мне это:

Необработанное исключение в 0x0fc5edac (msvcr90d.dll) в Executable_to_LinkDLL_to_FDDDLL.exe: 0xC0000005: Место записи нарушения прав доступа 0xbaadf00d.

Я использую библиотеки выпуска Octave. Исключение показано ниже. Мне было интересно, сталкивался ли кто-нибудь с этой проблемой.

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

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

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

Вот где ошибка происходит в моем коде (на основе следующего стека вызовов):

Вот где ошибка происходит в моем коде

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

0

Решение

Глядя на документацию Octave для string_vectorссылки на std::string используются. Это означает, что библиотека Octave должна быть собрана для компилятора и настроек, в которых вы разрабатываете.

Причина в том, что такие классы, как std::string не должен быть двоично совместимым с другой версией std::string, Когда вы использовали сборку релиза в отладочной версии, внутренние компоненты std::string отличаются в версии выпуска и отладки.

Тем не менее, даже если версии std::string будет бинарно-совместимым, у вас есть проблема, чтобы убедиться, что Octave DLL и ваше приложение используют одну и ту же кучу времени выполнения. Причина в том, что std::string использует динамически распределенную память и должна использовать одну и ту же кучу как для DLL, так и для приложения. Для этого необходимо использовать версию DLL библиотеки времени выполнения Visual Studio (/MD или же /MDd флаги компилятора должны быть установлены для выпуска или отладочной версии среды выполнения DLL, соответственно).

Итак, у вас есть две проблемы:

  1. Бинарная совместимость между версиями std::string между Octave DLL и вашим приложением, и

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

Ваше решение использования char * только избегает std::string ссылки и объекты от передачи. Я не знаю, насколько надежно это решение, так как кажется, что было бы очень легко ошибиться и вызвать std::string функционировать в какой-то момент.

Я просто хотел бы убедиться, что правильные библиотеки DLL используются при разработке и развертывании вашего приложения. Это именно то, что Microsoft делает со своими DLL — вы не можете смешивать и сопоставлять версии и отладки версий Microsoft DLL в вашем приложении, поэтому то же самое применимо и здесь. Единственный раз, когда вы можете смешивать / сопоставлять релиз и отладку DLL, это если DLL использует только «простые» типы, такие как DWORD, LONG, TSTR и т. Д., Или указатели на эти типы для параметров и возвращаемых значений.

3

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

Отладчик выполняет запись в неинициализированную память, которая тихо используется вашей программой в режиме Release. (То есть в режиме Release это катастрофа в ожидании). 0xbaadf00d на самом деле это своего рода сообщение отладчика; смотрите соответствующую запись Вот.

Не видя ваш код, трудно сказать, что это за проблема.

Изменить: Вы разместили отладочную выходную ссылку memcpy— так что случаи memcpy в вашем коде есть одно место, чтобы выглядеть очевидно.

2

Windows LocalAlloc помечает неинициализированную память кучи значением 0xbaadf00d.
Похоже, вы берете значение указателя из неинициализированного источника и пытаетесь записать в эту область памяти. Хотя это может «работать» в режиме выпуска, это может привести к повреждению памяти в программе, которая выполняется в течение более длительного периода времени.

1

Я решил эту проблему, реализовав следующий фрагмент кода. Вместо того, чтобы использовать string_vector класс Octave, теперь я использую массив char* лайк char*argv[2]={"embedded","-q"}; следовательно, ошибка была устранена, но я столкнулся с другой ошибкой, упомянутой в этой ссылке: Octave C ++ и VS2010

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

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