未选择 /clr 时编译的 Matlab 代码崩溃

Posted

技术标签:

【中文标题】未选择 /clr 时编译的 Matlab 代码崩溃【英文标题】:Compiled Matlab code crashes when /clr is not selected 【发布时间】:2014-03-06 21:51:59 【问题描述】:

我想知道为什么我在编译的 Matlab 库中使用的代码在未选择公共语言运行时时会崩溃。 举个简单的例子,我尝试将以下 Matlab 函数编译到共享库中:

function [volOut, volAvg]=testVarPass(volIn)
volOut=double(volIn);
volAvg=mean(volOut(:));
end

使用以下对 mcc 的调用: mcc -B csharedlib:mylib testVarPass.m

接下来,我设置了一个 Visual Studios 2010 控制台项目。

#include "stdafx.h"
#include "matrix.h"
#include "mylib.h"
int _tmain(int argc, _TCHAR* argv[])

    mxArray *vol_in;
    mxArray *vol_out;
    mxArray *vol_avg;
    mwSize dim_list[3];
    double *vol_avg_ptr;
    dim_list[0]=10;
    dim_list[1]=10;
    dim_list[2]=10;
    if( !mclInitializeApplication(NULL,0) )  //initialize Matlab Compiler Runtime
        return -1; 
     
    if (!mylibInitialize()) //initialize library
     
        return -2; 
    
    vol_in=mxCreateNumericArray(3,dim_list, mxINT16_CLASS, mxREAL);  //make a sample 3d array
    mlfTestVarPass(2, &vol_out, &vol_avg, vol_in); //crashes here
    vol_avg_ptr=mxGetPr(vol_avg);     
    /* Call the MCR and library termination functions */ 
    mylibTerminate(); 
    mclTerminateApplication();
    return 0;
  

如果我在构建项目时将公共语言运行时支持设置为:/clr...一切正常。 如果我在构建项目时公共语言运行时支持设置为:无...首先,调试器在调用 mylibInitialize 时会抛出许多异常。最常见的是:varflowFailed、tffFailed、CryptoPP、jitCgFailed 和 xsd_binder::MalformedDocumentError。其次,mlfTestVarPass 调用因访问冲突而崩溃。

我和我一起工作的程序员都想知道为什么。

其他信息: Windows 7的 视觉工作室 2010,SP1 视窗 SDK 7.1 Matlab 2013b

【问题讨论】:

【参考方案1】:

与我一起工作的程序员发现了这一点......

选择/ clr时,未初始化的指针设置为null。 当未选择 /clr 时,调试器会将未初始化的指针设置为任意值。然后,当调用 mlfTestVarPass 时,Matlab 的内存管理看到一个任意的 mxArray 并尝试释放未分配的内存。

这解释了崩溃,但是,我们仍然不明白为什么会有这么多第一次机会异常。它可能只是反映了 Mathworks 是如何编写代码的。

【讨论】:

以上是关于未选择 /clr 时编译的 Matlab 代码崩溃的主要内容,如果未能解决你的问题,请参考以下文章

由于未定义的行为或编译器错误导致 C++ 代码崩溃?

ILIL入门

使用 fopen 文件时,matlab 在没有转储文件的情况下崩溃

CLR加载程序集代码时,JIT编译器对性能的产生的影响

Matlab:无法使用 openmp 编译 mex(未定义的参考)

“clr-namespace” URI 指的是程序集中未包含的命名空间