如何防止Matlab在CUDA功能的(wrong) mex文件执行时崩溃

7

我目前正在开发一个带有CUDA功能的mex文件,用于在MATLAB中使用。当我做错了什么(例如错误的指针或类似的问题),MATLAB总是会崩溃(Windows提示我结束、发送报告给MathWorks或尝试继续)。有没有办法防止这种情况发生?这真的很烦人,但正如你自己可能知道的那样:几乎没有人可以在没有“试错”的情况下编写完美的代码...感谢迄今为止所做的努力!

3个回答

4
据我所知,没有办法防止Matlab在mex错误时崩溃。但您可以附加一个调试器到Matlab进程中并逐步执行代码。
我可以确定的是,如果您的代码位于外部dll中并加载到Matlab中,则此方法有效。我不确定这是否适用于mex文件。

哎呀,真可惜,因为这在开发我尚未完成的东西时经常发生 :( - tim

3
Matlab MEX文件页面,如果您还没有这样做,请使用以下命令编译MEX文件:

mex -g yourmexfile.c

这将允许您在调试过程中使用GDB或其他调试器。

这不会导致Matlab崩溃吧?如何附加调试器?抱歉,但这对我来说是新的东西... - tim
@Col 确保Matlab的内存管理器非常脆弱,我曾经成功地创建了非常奇怪的错误。但其中许多错误都可以通过此选项捕获。然后从命令行运行Matlab,从调试器中运行,就像你正在调试Matlab本身一样。 - Matt Phillips
1
“-g”绝对不能防止Matlab由于mex错误而崩溃。我很惊讶这是问题的被接受答案。“-g”确实可以帮助找到问题,但建议使用调试器几乎是不言自明的。 - pattivacek

2
您可以按照以下步骤使用Visual Studio和NVIDIA Nsight for Visual Studio来调试包括CUDA代码在内的Matlab mex文件。
  1. 定义系统环境变量NSIGHT_CUDA_DEBUGGER并将其设置为1
  2. 启动Matlab
  3. 启动NVIDIA Nsight。右键单击任务栏上的Nsight Monitor图标,选择选项。选择CUDA选项卡。对于使用此监视器进行CUDA附加选项,请单击下拉菜单并选择True
  4. 在Visual Studio中打开您的项目,设置断点并编译它。
  5. 转到工具 -> 附加到进程
  6. 单击传输字段旁边的下拉菜单,并选择Nsight GPU Debugger
  7. 确保您的主机名称列在限定符字段中。 请注意,默认情况下,此字段为空;第一次打开此对话框时,您必须手动选择计算机名称。
  8. 当您在限定符字段中输入计算机的主机名时,可用进程列表将出现在对话框中。可能附加CUDA使用的进程将在Type列中显示CUDA。如果一个进程被灰掉并且在Type列中列出了CUDA,则它已经被调试,因此无法附加。灰色而没有在Type列中列出CUDA的进程表示它在要调试的进程中没有CUDA使用。可以附加的进程将正常显示,并且附加按钮将启用。
  9. 确保Matlab在Type列中具有CUDA并选择它。
  10. Matlab命令行调用在CUDA mexfile中定义的函数。执行将在第一个断点处停止,然后可以开始调试。

对我来说有点晚了,但还是谢谢你的回答。希望能帮到其他搜索到这个问题的人 :) - tim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接