matlab使用mex文件时libmwm_interpreter.so中的浮点异常

时间:2014-09-08 11:36:40

标签: c++ matlab mex

我为MATLAB开发了一个MEX文件,我在ode45求解器中使用。

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
    //enable floating point exception
    feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW);

    size_t mrows,ncols;

    /* Check for proper number of arguments. */
    if(nrhs!=4) {
        mexErrMsgIdAndTxt( "HYPRO:invalidNumInputs",
                "4 input required.");
    }
    if(nlhs>2) {
        mexErrMsgIdAndTxt( "HYPRO:invalidNumOutputs",
                "Too many output arguments");
    }

    /* The input must be a noncomplex scalar double.*/
    for(int i=0;i<nrhs;i++){
        mrows = mxGetM(prhs[i]);
        ncols = mxGetN(prhs[i]);
        if( !mxIsDouble(prhs[i]) || mxIsComplex(prhs[i]) ||
                !(mrows==1 && ncols==1) ) {
            mexErrMsgIdAndTxt( "HYPRO:inputNotRealScalarDouble",
                    "Input must be a noncomplex scalar double.");
        }
    }

    /* Create matrix for the return argument. */
    plhs[0] = mxCreateDoubleMatrix((mwSize)mrows, (mwSize)ncols, mxREAL);

    /* Assign pointers to each input and output. */
    const double t = *mxGetPr(prhs[0]);
    const double p = *mxGetPr(prhs[1]);
    const double T = *mxGetPr(prhs[2]);
    const double U = *mxGetPr(prhs[3]);
    double& Thrust1 = *mxGetPr(plhs[0]);
    Thrust1 = 9000;
    double Thrust;
    Foam::List<double> Mfr;

    try{
        MyFunction(t,p,T,U,Thrust,Mfr);
    }catch (std::exception& e){
        mexErrMsgIdAndTxt( "HYPRO:error", e.what());
    }

    plhs[1] = mxCreateDoubleMatrix((mwSize)mrows, Mfr.size(), mxREAL);
    double* point = mxGetPr(plhs[1]);
    for (mwSize i = 0; i < Mfr.size(); i++) {
        point[i] = 40; //Mfr[i];
    }
}

正如您在上面的代码中看到的,我从MyFunction的输出中分离了MEX文件的输出,以便排除其中的任何问题,但行为如下。

MEX文件在从MATLAB手动调用时也很有效,并且在非常简单的for循环中。但是,当我通过一个函数调用ode45求解器时,该函数又调用了这个MEX文件,我得到了以下错误。

有趣的是,当ode45第一次调用MEX文件但第二次调用MEX文件时,不会发生错误。

在gdb中调试时会产生相同的行为,但由于MATLAB解释器的源代码不可用,因此没有可用的调试信息。

我的Matlab版本是R2013a(8.1.0.604)64位(glnxa64)

MATLAB崩溃文件:/home/trb12187/matlab_crash_dump.11254-1:

------------------------------------------------------------------------
      Floating point exception detected at Mon Sep  8 12:14:25 2014
------------------------------------------------------------------------

Configuration:
  Crash Decoding     : Disabled
  Current Visual     : 0x21 (class 4, depth 24)
  Default Encoding   : UTF-8
  GNU C Library      : 2.19 stable
  MATLAB Architecture: glnxa64
  MATLAB Root        : /usr/local/MATLAB/R2013a
  MATLAB Version     : 8.1.0.604 (R2013a)
  Operating System   : Linux 3.13.0-35-generic #62-Ubuntu SMP Fri Aug 15 01:58:42 UTC 2014 x86_64
  Processor ID       : x86 Family 6 Model 30 Stepping 5, GenuineIntel
  Virtual Machine    : Java 1.6.0_17-b04 with Sun Microsystems Inc. Java HotSpot(TM) 64-Bit Server VM mixed mode
  Window System      : The X.Org Foundation (11501000), display :0

Fault Count: 1

Abnormal termination:
Floating point exception

Register State (from fault):
  RAX = 0000000000000001  RBX = 00007fb110dda810
  RCX = 0000000000000000  RDX = 00007fb072653d70
  RSP = 00007fb110dda6c0  RBP = 00007fb110dda700
  RSI = 0000000000000001  RDI = 00007fb110dda810
   R8 = 0000000000000064   R9 = 0000000000000064
  R10 = 0000000000200000  R11 = 0000000000400000
  R12 = 0000000000000001  R13 = 00007fb072653d70
  R14 = 0000000000000000  R15 = 0000000000004000
  RIP = 00007fb123efeb2c  EFL = 0000000000010246
   CS = 0033   FS = 0000   GS = 0000

Stack Trace (from fault):
[  0] 0x00007fb123efeb2c /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+04434732
[  1] 0x00007fb123efe875 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+04434037
[  2] 0x00007fb123f02645 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+04449861
[  3] 0x00007fb123eecfd7 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+04362199
[  4] 0x00007fb123eed950 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+04364624
[  5] 0x00007fb123f347ec /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+04655084
[  6] 0x00007fb123ef132f /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+04379439
[  7] 0x00007fb123e7e204 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+03908100
[  8] 0x00007fb123e80b76 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+03918710
[  9] 0x00007fb123e80fac /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+03919788
[ 10] 0x00007fb123c9d8ac /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+01939628
[ 11] 0x00007fb123c99993 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+01923475
[ 12] 0x00007fb123c9a797 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+01927063
[ 13] 0x00007fb123d05e50 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+02367056
[ 14] 0x00007fb12444a6b2 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_dispatcher.so+00562866
        _ZN8Mfh_file11dispatch_fhEiPP11mxArray_tagiS2_+00000594
[ 15] 0x00007fb123ce8256 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+02245206
[ 16] 0x00007fb123c98a86 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+01919622
[ 17] 0x00007fb123c9d374 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+01938292
[ 18] 0x00007fb123c99993 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+01923475
[ 19] 0x00007fb123c9a797 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+01927063
[ 20] 0x00007fb123d05e50 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+02367056
[ 21] 0x00007fb12444a6b2 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_dispatcher.so+00562866
        _ZN8Mfh_file11dispatch_fhEiPP11mxArray_tagiS2_+00000594
[ 22] 0x00007fb11b0f453a  /usr/local/MATLAB/R2013a/bin/glnxa64/libmwmcos.so+01672506
[ 23] 0x00007fb11b09513a  /usr/local/MATLAB/R2013a/bin/glnxa64/libmwmcos.so+01282362
[ 24] 0x00007fb11b0953be  /usr/local/MATLAB/R2013a/bin/glnxa64/libmwmcos.so+01283006
[ 25] 0x00007fb11b09712c  /usr/local/MATLAB/R2013a/bin/glnxa64/libmwmcos.so+01290540
[ 26] 0x00007fb11b181f17  /usr/local/MATLAB/R2013a/bin/glnxa64/libmwmcos.so+02252567
[ 27] 0x00007fb1243fcaf8 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_dispatcher.so+00244472
        _ZN13Mfh_MATLAB_fn11dispatch_fhEiPP11mxArray_tagiS2_+00000488
[ 28] 0x00007fb123ce7d33 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+02243891
[ 29] 0x00007fb123cf7798 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+02307992
[ 30] 0x00007fb123cfb436 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+02323510
[ 31] 0x00007fb123cfc54c /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+02327884
[ 32] 0x00007fb123c7eb06 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+01813254
[ 33] 0x00007fb123c75f28 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+01777448
[ 34] 0x00007fb123c9e136 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+01941814
[ 35] 0x00007fb123c99993 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+01923475
[ 36] 0x00007fb123c9a797 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+01927063
[ 37] 0x00007fb123d05e50 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+02367056
[ 38] 0x00007fb12444a6b2 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_dispatcher.so+00562866
        _ZN8Mfh_file11dispatch_fhEiPP11mxArray_tagiS2_+00000594
[ 39] 0x00007fb123ce8256 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+02245206
[ 40] 0x00007fb123c7409d /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+01769629
[ 41] 0x00007fb123c9cb0e /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+01936142
[ 42] 0x00007fb123c99993 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+01923475
[ 43] 0x00007fb123c9a797 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+01927063
[ 44] 0x00007fb123d05e50 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+02367056
[ 45] 0x00007fb12444a6b2 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_dispatcher.so+00562866
        _ZN8Mfh_file11dispatch_fhEiPP11mxArray_tagiS2_+00000594
[ 46] 0x00007fb123cd4dcb /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+02166219
[ 47] 0x00007fb123c927cc /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+01894348
[ 48] 0x00007fb123c8ee1d /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+01879581
[ 49] 0x00007fb123c8f255 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+01880661
[ 50] 0x00007fb11ad44fae /usr/local/MATLAB/R2013a/bin/glnxa64/libmwbridge.so+00139182
[ 51] 0x00007fb11ad45111 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwbridge.so+00139537
[ 52] 0x00007fb11ad45ce5 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwbridge.so+00142565
        _Z8mnParserv+00000725
[ 53] 0x00007fb1246e23d2   /usr/local/MATLAB/R2013a/bin/glnxa64/libmwmcr.so+00447442
        _ZN11mcrInstance30mnParser_on_interpreter_threadEv+00000034
[ 54] 0x00007fb1246c19ac   /usr/local/MATLAB/R2013a/bin/glnxa64/libmwmcr.so+00313772
[ 55] 0x00007fb1246c1b88   /usr/local/MATLAB/R2013a/bin/glnxa64/libmwmcr.so+00314248
[ 56] 0x00007fb1182595c6   /usr/local/MATLAB/R2013a/bin/glnxa64/libmwuix.so+00480710
[ 57] 0x00007fb118266df2   /usr/local/MATLAB/R2013a/bin/glnxa64/libmwuix.so+00536050
[ 58] 0x00007fb124dac862 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwservices.so+01845346
[ 59] 0x00007fb124dad50f /usr/local/MATLAB/R2013a/bin/glnxa64/libmwservices.so+01848591
        _Z25svWS_ProcessPendingEventsiib+00001615
[ 60] 0x00007fb1246c25ef   /usr/local/MATLAB/R2013a/bin/glnxa64/libmwmcr.so+00316911
[ 61] 0x00007fb1246c2f5c   /usr/local/MATLAB/R2013a/bin/glnxa64/libmwmcr.so+00319324
[ 62] 0x00007fb1246bc592   /usr/local/MATLAB/R2013a/bin/glnxa64/libmwmcr.so+00292242
[ 63] 0x00007fb122850182              /lib/x86_64-linux-gnu/libpthread.so.0+00033154
[ 64] 0x00007fb12257cfbd                    /lib/x86_64-linux-gnu/libc.so.6+01028029 clone+00000109

感谢您的帮助,如果您需要更多详细信息,请与我们联系。 的Alessandro

1 个答案:

答案 0 :(得分:0)

我发现了问题,可能只是Stackoverflow的积极影响对我来说已经足够了。 基本上问题是启用浮点异常:feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW);注释掉这一行解决了问题。可能这也影响了MATLAB解释器的行为,它无法像往常一样处理浮点异常。 为了在我的函数中保持浮点异常(我不希望通过我的代码传播)我启用了然后在调用MyFunction之前和之后禁用了浮点异常,所以最终的工作版本是mex文件是:

void mexFunction( int nlhs, mxArray *plhs[],
        int nrhs, const mxArray *prhs[] )
{

    size_t mrows,ncols;

    /* Check for proper number of arguments. */
    if(nrhs!=4) {
        mexErrMsgIdAndTxt( "HYPRO:invalidNumInputs",
                "4 input required.");
    }
    if(nlhs>2) {
        mexErrMsgIdAndTxt( "HYPRO:invalidNumOutputs",
                "Too many output arguments");
    }

    /* The input must be a noncomplex scalar double.*/
    for(int i=0;i<nrhs;i++){
        mrows = mxGetM(prhs[i]);
        ncols = mxGetN(prhs[i]);
        if( !mxIsDouble(prhs[i]) || mxIsComplex(prhs[i]) ||
                !(mrows==1 && ncols==1) ) {
            mexErrMsgIdAndTxt( "HYPRO:inputNotRealScalarDouble",
                    "Input must be a noncomplex scalar double.");
        }
    }

    /* Create matrix for the return argument. */
    plhs[0] = mxCreateDoubleMatrix((mwSize)mrows, (mwSize)ncols, mxREAL);

    /* Assign pointers to each input and output. */
    const double t = *mxGetPr(prhs[0]);
    const double p = *mxGetPr(prhs[1]);
    const double T = *mxGetPr(prhs[2]);
    const double U = *mxGetPr(prhs[3]);

    double& Thrust = *mxGetPr(plhs[0]);
    Foam::List<double> Mfr;

    try{
        //enable floating point exception
        //it has to be disabled when exiting from this function!!
        feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW);
        MyFunction(t,p,T,U,Thrust,Mfr);
        fedisableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW);
    }catch (std::exception& e){
        mexErrMsgIdAndTxt( "HYPRO:error", e.what());
    }

    plhs[1] = mxCreateDoubleMatrix((mwSize)mrows, Mfr.size(), mxREAL);
    double* point = mxGetPr(plhs[1]);
    for (mwSize i = 0; i < Mfr.size(); i++) {
        point[i] = Mfr[i];
    }
}

非常感谢您的关注,我希望这对其他人有任何帮助。

的Alessandro