释放模式工作正常,但调试模式使用Octave DLL提供未处理的异常

时间:2014-08-07 20:28:09

标签: c++ exception octave release-mode debug-mode

发布模式工作正常,但调试模式给了我这个:

Executable_to_LinkDLL_to_FDDDLL.exe中0x0fc5edac(msvcr90d.dll)的未处理异常:0xC0000005:访问冲突写入位置0xbaadf00d。

我正在使用Octave版本的DLL。例外情况如下所示。我想知道是否有人遇到过这个问题。

enter image description here

enter image description here

enter image description here

这是我的代码中发生错误的地方(基于以下调用堆栈):

Here is where error happens in my code

enter image description here

4 个答案:

答案 0 :(得分:3)

查看string_vector的Octave文档,使用了对std::string的引用。这意味着需要为正在开发的编译器和设置构建Octave库。

原因是诸如std::string之类的类不需要与另一版本的std::string二进制兼容。在调试版本中使用发布版本时,std::string的内部版本在发行版和调试版中是不同的。

但是,即使std::string的版本与二进制兼容,也存在确保Octave DLL和应用程序使用相同的运行时堆的问题。原因是std::string使用动态分配的内存,并且必须对DLL和应用程序使用相同的堆。为确保这一点,必须使用Visual Studio运行时库的DLL版本(必须分别为DLL运行时的发行版或调试版设置/MD/MDd编译器标志。)

所以你有两个问题:

  1. Octave DLL与您的应用程序之间的std::string版本之间的二进制兼容性,以及

  2. 确保构建DLL和应用程序以使用运行时库的DLL版本来确保使用相同的内存堆。

  3. 使用char *的解决方案只能避免传递std::string引用和对象。我不知道这个解决方案有多扎实,因为看起来很容易出错并在某个时候调用std::string函数。

    我只是确保在开发和部署应用程序时使用正确的DLL。这正是微软用它的DLL做的 - 你不能混合和匹配你的应用程序中的Microsoft DLL的发布和调试版本,所以这同样适用于此。唯一可以混合/匹配释放和调试DLL的时候是DLL只使用“简单”类型,如DWORD,LONG,TSTR等,或指向这些类型的参数和返回值。

答案 1 :(得分:2)

调试器正在接收对未初始化内存的写入,该内存在发布模式下由程序默默使用。 (即,在发布模式下,这是一场等待发生的灾难。)0xbaadf00d实际上是一种调试器消息;请参阅相关条目here

如果没有看到你的代码,就很难说出问题所在。

编辑:您发布了引用memcpy的调试输出 - 因此代码中memcpy的实例显然是一个显而易见的地方。

答案 2 :(得分:1)

Windows LocalAlloc使用值0xbaadf00d标记未初始化的堆内存。 看起来您正在从未初始化的源获取指针值并尝试写入该内存位置。虽然这可能在发布模式下“起作用”,但它可能会导致运行较长时间的程序中的内存损坏。

答案 3 :(得分:0)

我通过实现以下代码解决了这个问题。而不是使用string_vector类的Octave,现在我使用char*数组char*argv[2]={"embedded","-q"};因此错误已解决,但我遇到了此链接中提到的另一个错误:{{3 }}

enter image description here