未加载符号:未​​加载 libmex.pdb(throw_segv_longjmp_seh_filter() = EXCEPTION_CONTINUE_SEARCH:C++ 异常)

Posted

技术标签:

【中文标题】未加载符号:未​​加载 libmex.pdb(throw_segv_longjmp_seh_filter() = EXCEPTION_CONTINUE_SEARCH:C++ 异常)【英文标题】:No Symbols Loaded: libmex.pdb not loaded (throw_segv_longjmp_seh_filter() = EXCEPTION_CONTINUE_SEARCH : C++ exception) 【发布时间】:2016-09-09 17:23:17 【问题描述】:

为了创建一个MEX function 并在我的MATLAB 代码中使用它,如下所示:

[pow,index] = mx_minimum_power(A11,A12,A13,A22,A23,A33);  

我已经创建了文件mx_minimum_power.cpp 并在其中编写了以下代码:

#include <math.h>
#include <complex>
#include "mex.h"
#include "matrix.h"
#include "cvm.h"
#include "blas.h"
#include "cfun.h"

using std::complex;
using namespace cvm;

/* The gateway function */
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])

    const int arraysize = 62172;
    const int matrixDimention = 3;
    float *inMatrixA11 = (float *)mxGetPr(prhs[0]);
    complex<float> *inMatrixA12 = (complex<float> *)mxGetPr(prhs[1]);
    complex<float> *inMatrixA13 = (complex<float> *)mxGetPr(prhs[2]);
    float *inMatrixA22 = (float *)mxGetPr(prhs[3]);
    complex<float> *inMatrixA23 = (complex<float> *)mxGetPr(prhs[4]);
    float *inMatrixA33 = (float *)mxGetPr(prhs[5]);
    basic_schmatrix< float, complex<float> > A(matrixDimention);
    int i = 0;
    for (i = 0; i < arraysize; i++)
    
        A.set(1, 1, inMatrixA11[i]);
        A.set(1, 2, inMatrixA12[i]);
        A.set(1, 3, inMatrixA13[i]);
        A.set(2, 2, inMatrixA22[i]);
        A.set(2, 3, inMatrixA23[i]);
        A.set(3, 3, inMatrixA33[i]);
    
  

然后为了能够调试代码,我创建了mx_minimum_power.pdbmx_minimum_power.mexw64 文件,在Matlab Command Window 中使用以下代码:

mex -g mx_minimum_power.cpp cvm_em64t_debug.lib  

文件blas.hcfun.hcvm.hcvm_em64t_debug.libmx_minimum_power.cpp 位于同一目录中。 它们是CVM Class Library的头文件和库文件。

然后我将MATLAB.exe附加到Visual Studio 2013,使用explained here的方式。 并在line40 处设置了breakpoint

当我运行我的MATLAB 代码时,在指定的行之前没有错误。

但如果我点击Step Over 按钮,我会遇到以下消息:

将以下信息添加到Output

First-chance exception at 0x000007FEFCAE9E5D in MATLAB.exe: Microsoft C++ exception: cvm::cvmexception at memory location 0x0000000004022570.
> throw_segv_longjmp_seh_filter()
throw_segv_longjmp_seh_filter(): C++ exception
< throw_segv_longjmp_seh_filter() = EXCEPTION_CONTINUE_SEARCH  

你能告诉我为什么在那一行需要libmex.pdb,我应该如何解决这个问题?


如果我停止调试,我会在MATLAB Command Window 中得到以下信息:

Unexpected Standard exception from MEX file.
What() is:First index value 0 is out of [1,4) range  

在按下step over 按钮之前,A11[0],A12[0],A13[0],A22[0],A23[0],A33[0] 的值如下:

这正好符合我的预期,根据 MATLAB 传递给 MEX 函数的内容:

问题可能是矩阵A分配错误,在按下step over按钮之前如下。

【问题讨论】:

在某个 MATLAB 模块中引发了异常。 Visual Studio 尝试在调试数据库文件 (.pdb) 中查找相应的代码,以向您显示错误的来源,但无法找到它,因为 MATLAB 未附带调试信息(这些库是专有的)。也可以进行拆卸,但在您的情况下它没有多大帮助。 我建议您在断点所在的行验证数组访问的正确性。您可以将鼠标悬停在变量上以查看其值,或在“Autos”或“Locals”窗口(菜单 Debug -> Windows)或“Watches”窗口之一中浏览值。 我会担心这些非常可疑的演员表。将断点分成两行:(1)从数组读取到中间变量auto tmp = inMatrixA11[i] 和(2)A.set(..., tmp)。之后,围绕这些行调查程序状态转换。顺便问一下,在哪个迭代 (i) 上发生了异常? 【参考方案1】:

出现问题是因为我们在cvm.h文件的第48到53行有如下代码:

// 5.7 0-based indexing
#if defined (CVM_ZERO_BASED)
#   define CVM0 TINT_ZERO //!< Index base, 1  by default or 0 when \c CVM_ZERO_BASED is defined
#else
#   define CVM0 TINT_ONE  //!< Index base, 1  by default or 0 when \c CVM_ZERO_BASED is defined
#endif  

默认情况下会生成CVM0 = 1。所以如果我们在指定行按下Step Into(F11)按钮两次,我们将进入文件cvm.h的第34883行:

basic_schmatrix& set(tint nRow, tint nCol, TC c) throw(cvmexception)

    this->_set_at(nRow - CVM0, nCol - CVM0, c);
    return *this;
  

this-&gt;_set_at(nRow - CVM0, nCol - CVM0, c); 行按Step Into(F11),您将转到函数_set_at 的定义:

// sets both elements to keep matrix hermitian, checks ranges
// zero based
void _set_at(tint nRow, tint nCol, TC val) throw(cvmexception)

    _check_lt_ge(CVM_OUTOFRANGE_LTGE1, nRow, CVM0, this->msize() + CVM0);
    _check_lt_ge(CVM_OUTOFRANGE_LTGE2, nCol, CVM0, this->nsize() + CVM0);
    if (nRow == nCol && _abs(val.imag()) > basic_cvmMachMin<TR>())  // only reals on main diagonal
        throw cvmexception(CVM_BREAKS_HERMITIANITY, "real number");
    
    this->get()[this->ld() * nCol + nRow] = val;
    if (nRow != nCol) 
        this->get()[this->ld() * nRow + nCol] = _conjugate(val);
    

按下Step Over(F10)按钮,你会得到结果:

所以为了得到nRow=1nCol=1 而不是nRow=0nCol=0,它们超出了[1,4) 的范围,你应该把那行代码写成:

A.set(2, 2, inMatrixA11[i]);

【讨论】:

以上是关于未加载符号:未​​加载 libmex.pdb(throw_segv_longjmp_seh_filter() = EXCEPTION_CONTINUE_SEARCH:C++ 异常)的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2008 未加载 MFC dll 符号

调试符号未加载

在运行时动态加载库时出现“未解析的外部符号”错误

尝试使用 dlopen 加载库时未定义的符号

Python ctypes加载错误:未定义的符号

动态加载库的未定义符号“typeinfo”