Debugging 是否有任何方法可以使用Matlab调试器调试编译的组件?

Debugging 是否有任何方法可以使用Matlab调试器调试编译的组件?,debugging,matlab,dll,com,matlab-deployment,Debugging,Matlab,Dll,Com,Matlab Deployment,是否有一种方法可以使用本机Matlab调试器(如VisualStudio的“附加到进程”选项或类似选项)调试已编译的Matlab组件 我指的是EXE独立文件、DLL、COM进程内服务器或.NET组件。你不能像在编译之前使用MATLAB自己的调试器那样逐行调试MATLAB代码。MATLAB部署产品采取的一个步骤是加密MATLAB代码(这样在分发部署的组件时可以保留您的IP)。部署后在调试器中单步执行代码的功能将无法达到此目的。您可以按照以下说明进行调试: 调试: 使用调试工具可以让您在执行过程中停

是否有一种方法可以使用本机Matlab调试器(如VisualStudio的“附加到进程”选项或类似选项)调试已编译的Matlab组件


我指的是EXE独立文件、DLL、COM进程内服务器或.NET组件。

你不能像在编译之前使用MATLAB自己的调试器那样逐行调试MATLAB代码。MATLAB部署产品采取的一个步骤是加密MATLAB代码(这样在分发部署的组件时可以保留您的IP)。部署后在调试器中单步执行代码的功能将无法达到此目的。

您可以按照以下说明进行调试:

调试:

使用调试工具可以让您在执行过程中停止程序,以检查变量的内容和其他可以帮助您发现程序错误的内容。M文件程序在“断点”处停止。要创建断点,只需按F12键,光标所在的行旁边就会出现一个红点。您也可以单击M-file窗口左侧行号旁边的破折号,以获得相同的结果

然后从菜单中按F5或调试->运行以运行程序。它将在断点处停止,旁边有一个绿色箭头。然后可以使用“调试”菜单检查工作区中变量的内容、步骤、继续或停止程序。要检查变量的内容,只需在工作区中键入它的名称,但要注意:您只能查看停在其中的文件中的变量值,因此这意味着您可能需要多个断点才能找到问题的根源。有几种不同的方法可以从断点在程序中移动。一种方法是逐行检查整个程序,输入调用的每个函数。如果你不知道问题在哪里,这是有效的。还有一种方法,可以一次一行地单步遍历当前停在其中的函数,而不是逐行遍历子函数,MATLAB只会给出这些函数的结果

最后,请注意,在保存M文件之前,不能设置断点。如果您更改了某些内容,则必须在断点“注意”您的更改之前进行保存。这种情况在MATLAB中通过将点从红色更改为灰色来描述。有时,你会保存,但点仍然是灰色的;当多个文件中有多个断点时,就会发生这种情况。为了避免这个问题(这真的很烦人),你必须一直进入“退出调试模式”,直到它变成灰色。一旦您完全脱离调试模式,您的文件将被保存,并且您将准备开始另一轮调试。使用注释帮助您调试代码。您想测试省略某些代码行的效果(例如,要查看如果去掉它们,程序是否仍返回Inf),可以注释掉代码。要执行此操作,请突出显示它,然后转到: 文本->评论

或者按CTRL+R。这将在每行前面放一个“%”;如果该行已注释掉,它将在其中放置另一个“%”,因此当您取消注释它们时,注释行的模式不会改变。注释行将被编译器忽略,因此其效果是程序在没有注释行的情况下运行。 要取消对行的注释,请转到 文本->取消注释 或者按CTRL+T。 注释的另一个用途是测试两个不同的可能代码集之间的差异,以执行某些操作(例如,您可能希望测试使用ODE113而不是ODE45来解微分方程的效果,因此每个代码集只能调用一行代码)。您可以通过注释一个并运行程序来测试差异,然后取消注释一个并注释另一个,然后再次调用程序

如何避开无限循环?
MATLAB不能直接告诉你有一个无限循环,它试图给你一些提示。第一个是当你终止程序时。按CTRL+C终止,MATLAB会给你一条消息,告诉你停在哪一行。如果你的程序运行了很长时间,很可能你停止的那条线就在无限循环的中间。有时MATLAB甚至不允许您返回主窗口按CTRL-C。在这种情况下,您可能必须终止整个MATLAB过程。在此之后,在循环中添加一个“pause(0.001)”或一个类似的小值,您怀疑它是无限的。每当MATLAB通过此指令时,您将能够在(非常)短的时间内与MATLAB进行交互,例如,转到主窗口并按CTRL-C,MATLAB将能够响应您的命令。

我尝试使用以下方法: 尝试 抓住我 waitbar(0,ME.message) 结束

这是一个非常有效和通用的解决方案

您可能希望将代码分解为多个部分,并对每个部分进行调试,以节省编译时间

祝你好运,
dan

你是说编译的.m文件还是mex文件?@Oli,我更新了这个问题。没有办法编译调试版本吗?没有。您所能做的最好的事情是在代码周围散布
disp
语句,并在运行时以某种方式打开它们(可能是在应用程序中手动翻转开关,或者可能是在文件系统上放置具有已知名称和路径的文件)。我认为我们应该向MathWorks发送这样的请求。我应该补充一点,
mcc
有一个
-g
选项,该选项将生成调试符号信息,使您能够回溯到您可以识别MCR初始化、函数调用、,或者终止程序。但不是实际调试部署的组件本身。您可以调用SLF4J/log4j/java.util.logging框架包,而不是调用
disp