无法进入MEX功能

时间:2015-03-04 19:22:35

标签: linux matlab debugging gdb mex

问题:

我无法进入我的MEX功能。我究竟做错了什么?显而易见的答案是SEGSEGVSIGUSR1但最好能够深入了解其原因。至少SIGUSR1

环境 - x86_64 linux 软件 - Matlab 2012a 调试器 - GDB

有一些序言,因为我认为回答这个问题并了解我理解中的漏洞是有意义的。

带有调试标志的编译mex文件

用matlab作为可执行文件启动gdb,用-Dgdb启动gdb(gdb设置为调试器)

bash:>matlab -Dgdb

在命令行中运行matlab

(gdb) run -nojvm

在启动Matlab的过程中,我看到一堆“缺少单独的debuginfo for ... *。so”并且还遇到了一些分段错误(SIGSEGV)

我将gdb分段故障信号处理设置为打印但不停止。

gdb>handle SIGSEGV nostop print pass
gdb>handle SIGUSR1 nostop print pass

Signal       Stop    Print     Pass     Description
SIGSEGV       No     Yes        Yes     Segmentation fault
SIGUSR1       No     Yes        Yes     User defined signal 1

禁用SIGSEGV后,我可以进入Matlab命令行,其中所有内容似乎都很好,并且Matlab似乎正在运行。

启用mex调试

matlab>>dbmex on
matlab>>yprime(1,[1,2,3,4])


Program received signal SIGUSR1, User defined signal 1.

MEX FILE: /home/user/test/prime/yprime.mexa64 entry point located 
at address 0xde5e3a60
Add breakpoints at the debugger prompt and issue a "continue" to resume 
execution of MATLAB.


ans =

    2.0000    8.9685    4.0000   -1.0947

根据输出ans,我们已经通过yprime() mex例程并将结果返回给Matlab。

如果我不绕过SIGUSR1会怎样?

如果我没有绕过SIGUSR1,我会得到以下输出:

>> yprime(1,[1,2,3,4])         

Program received signal SIGUSR1, User defined signal 1.
0x0000003c83c0b5bc in pthread_cond_wait@@GLIBC_2.3.2 () from    /lib64/libpthread.so.0
Missing separate debuginfos, use: debuginfo-install 
glibc-2.12-1.149.el6_6.5.x86_64 libICE-1.0.6-1.el6.x86_64 
libSM-1.2.1-2.el6.x86_64 libX11-1.6.0-2.2.el6.x86_64 
libXau-1.0.6-4.el6.x86_64 libXcursor-1.1.14-2.1.el6.x86_64 
libXext-1.3.2-2.1.el6.x86_64 libXfixes-5.0.1-2.1.el6.x86_64 
libXmu-1.1.1-2.el6.x86_64 libXrender-0.9.8-2.1.el6.x86_64 
libXt-1.1.4-6.1.el6.x86_64 libuuid-2.17.2-12.18.el6.x86_64 
libxcb-1.9.1-2.el6.x86_64 ncurses-libs-5.7-3.20090208.el6.x86_64 
nss-softokn-freebl-3.14.3-22.el6_6.x86_64 zlib-1.2.3-29.el6.x86_64


(gdb) bt
#0  0x0000003c83c0b5bc in pthread_cond_wait@@GLIBC_2.3.2 () 
           from /lib64/libpthread.so.0
#1  0x00007f2440f10774 in mcr_run_main(...l) ()
           from /opt/matlab_2012a/bin/glnxa64/libmwmcr.so
#2  0x00000000004026e0 in ?? ()
#3  0x0000003c8381ed5d in __libc_start_main () from /lib64/libc.so.6
#4  0x0000000000402579 in ?? ()
#5  0x00007ffffc6f3678 in ?? ()
#6  0x000000000000001c in ?? ()
#7  0x0000000000000002 in ?? ()
#8  0x00007ffffc6f4a9b in ?? ()
#9  0x00007ffffc6f4ac0 in ?? ()
#10 0x0000000000000000 in ?? ()

2 个答案:

答案 0 :(得分:1)

  1. 请勿在{{1​​}}上设置nostop,让它进入调试器。

  2. 阅读MATLAB告诉你的事情:

  3.   

    在调试器提示符处添加断点并发出“SIGUSR1”以继续   执行MATLAB。

    收到SIGUSR1时无需回溯(continue)。这不是需要调试的错误,只是有机会在MEX文件加载后设置断点。

答案 1 :(得分:0)

  

我无法进入我的MEX功能。我做错了什么?

你从未展示尝试进入你的职能部门。

你应该执行一次(保持你拥有的SIGSEGVSIGUSR1处置),然后在函数上设置一个断点并再次调用它。这一次,GDB应该在你的功能中停止。