由于科研需要,我经常在Ubuntu下使用MATLAB,在这里给大家介绍一个如何用Eclipse在Ubuntu下调试mex程序的方法。
我的电脑上安装有Nsight(NVIDIA推出的CUDA集成开发环境),而Nsight是基于Eclipse CDT构建的,因此这里就以Nsight为例讲解具体的调试方法。
首先编写一个简单的mex源程序helloMex.cpp,代码如下:
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
mexPrintf("Hello, mex!\n");
mexPrintf("This is mex file.\n");
}
编写完成后,在MATLAB中执行如下命令编译生成可执行mex文件helloMex.mexa64:
mex -g helloMex.cpp
注意,mex命令中的 -g
选项不能省略,否则无法调试程序,具体原因可以查看MATLAB中的帮助文档。
打开Nsight,在Nsight下新建工程如下:
注意 Toolchans 要选择 Linux GCC ,点击 Next,选择 Debug 配置,点击 FInish,工程创建完成。进行下面的步骤前要确保源程序被添加到工程中。
接下来进行调试。首先在源程序中的 mexPrintf("This is mex file.\n");
这一行加上断点。然后,在工具栏上单击 Debug 按钮旁边的下三角箭头,在菜单中选择 Debug Configurations … ,打开Debug配置对话框,如下所示:
在左边的列表中选中 C/C++ Attach to Application,在该选项下新建一个 Debug 配置,起名为 helloMex Debug
,之后在右边进行进一步的配置。在 Main 选项卡中,把 C/C++ Application 制定为刚刚生成的 helloMex.mexa64,最重要的是要确保 Disable auto build 被选中(因为该工程没有配置构建选项,如果使用默认设置会出现错误),调试器要设置为 GDB(DSF)。之后进入 Debugger 选项卡,将 Debugger 选中为 gdb(即使已经选中,这一步也需要执行一次,以确保调试器设置正确)。
接着点击 Debug 按钮,弹出 Select Processes 对话框,选择 MATLAB 所处的进程,如下所示:
点击 OK,进入调试模式(确保进入用于 Debug 的工作界面,否则无法进行后续操作)。由于 Nsight (或 Eclipse)在进入调试模式时会暂停程序的运行,因此这时候 MATLAB 程序是处于“僵死”的状态,这时候单击工具栏中的(Resume),即可恢复 MATLAB 为运行状态。这时在 MATLAB 的命令窗口中调用 helloMex()
,Nsight 会让程序暂停在刚刚设置的断点处,如下所示:
图中的红框处的信息表明 Nsight 已经在开始调试 mex 程序。
最后需要强调一下从调试模式退出的方法。在退出调试模式的时候,应该选择(Disconnect)按钮,而不是(Terminate)按钮。Disconnect 只是把调试器与 MATLAB 断开连接而不会终止 MATLAB 程序。如果选择 Terminate,调试器与 MATLAB 会被同时 Kill 掉,这时就只能重新运行 MATLAB 了。