【问题标题】:Is there any way to debug compiled components using Matlab Debugger?有什么方法可以使用 Matlab Debugger 调试已编译的组件?
【发布时间】:2012-01-23 02:59:19
【问题描述】:

有没有一种方法可以调试我编译的 Matlab 组件,使用本机 Matlab 调试器,如 Visual Studio“附加到进程”选项或类似的东西?

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

【问题讨论】:

  • 你的意思是编译的 .m 文件还是 mex 文件?
  • @Oli,我更新了问题。

标签: debugging matlab dll com matlab-deployment


【解决方案1】:

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

【讨论】:

  • 没有办法编译出调试版吗?
  • 不,没有。您可以做的最好的事情是在代码周围传播disp 语句,并在运行时以某种方式打开它们(可能在应用程序中手动翻转开关,或者可能将具有已知名称和路径的文件放在文件系统)。
  • 我认为我们应该向 MathWorks 提出这样的请求。
  • 我应该补充一点,mcc 有一个 -g 选项,它将生成调试符号信息,使您能够回溯到可以识别初始化是否发生故障的点的 MCR、函数调用或终止例程。但不要实际调试已部署的组件本身。
  • 您可以调用与 Matlab 捆绑的 SLF4J/log4j/java.util.logging 框架,而不是 disp 调用。这使您可以在运行时使用普通的 Java 日志配置控件打开或关闭它们(通过细粒度的控制)。
【解决方案2】:

我尝试过使用类似的东西: 尝试 抓住我 等待栏(0,ME.message) 结束

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

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

祝你好运, 丹

【讨论】:

    【解决方案3】:

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

    调试:

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

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

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

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

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

    【讨论】:

    • 感谢您的回答,但我的问题是关于调试编译的组件。
    猜你喜欢
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    相关资源
    最近更新 更多