Matlab 在中间运行脚本停止

Matlab 在中间运行脚本停止,matlab,Matlab,我有一个脚本在做一些计算,并将一些不可见的绘图保存到linux服务器上for循环中的图像文件中 当我运行脚本时,它通常会被夹在中间的某个地方。我不确定它到底在哪里停止,但我可以通过打印输出知道for循环的哪个迭代停止。如果我从迭代停止的地方重新运行它,它可以继续运行到那个地方。所以在我看来,似乎没有错误 我只是想知道我怎么能确定它停在哪一条线上 问题的原因可能是什么?我如何从开始到结束运行整个脚本 谢谢 更新: 我使用dbstop dbstop if error dbstop if war

我有一个脚本在做一些计算,并将一些不可见的绘图保存到linux服务器上for循环中的图像文件中

当我运行脚本时,它通常会被夹在中间的某个地方。我不确定它到底在哪里停止,但我可以通过打印输出知道for循环的哪个迭代停止。如果我从迭代停止的地方重新运行它,它可以继续运行到那个地方。所以在我看来,似乎没有错误

我只是想知道我怎么能确定它停在哪一条线上

问题的原因可能是什么?我如何从开始到结束运行整个脚本

谢谢


更新:

我使用dbstop

dbstop if error  
dbstop if warning  
run path2script

运行仍然会遇到一些问题,并且没有给出关于原因的消息。

这是什么类型的脚本

你的内存用完了吗?如果超过了分配的最大堆大小,它可能会崩溃。当您重新启动它时,它将从它原来拥有的所有内存开始,并可以在再次使用所有内存之前一直运行到完成


我建议您检查内存泄漏。

当您的脚本被“卡住”时,会发生什么情况?它是返回到提示符,还是matlab只是挂起?如果是后者,那么听起来代码中有一个无限循环…

如果不了解脚本和环境,很难判断。你确定它被卡住了,不只是忙于计算或获取更多内存吗?您可以尝试在发生挂起的迭代前不久设置一个条件断点,然后使用调试器以交互方式单步执行以下代码。

正如groovingandi所建议的,在for循环通常被卡住的迭代开始时,在代码中设置一个条件断点。可以使用以下命令执行此操作:

dbstop in runscript at 500 if iLoop==365 
% where 500 is the first line within the for loop,
% and 365 is the iteration causing problems
如果您的脚本在没有断点的情况下被卡住,但如果您使用断点然后继续,则可以愉快地继续超过该点,这通常表示您遇到了与时间相关的偶发故障,可能是竞争条件。也许您正在将一个文件写入操作系统,然后立即查看操作系统,以确定下一个文件的名称,但是您的文件系统正在略微缓存?类似的事情也给我带来了类似的问题


仔细查看您的代码在每次循环中所做的事情,以了解任何可能依赖于之前可能异步运行的步骤的内容

您可以尝试使用该函数并保存输出,我想在每次迭代中覆盖一个文件就可以了。

我想补充一点,中止(ctrl+c)脚本将抛出一个错误,指示中止时它在哪一行。

这里有一种方法可以找出发生了什么:

  • 如果出现错误,则打开dbstop
  • 一旦你的代码真的卡住了,点击CTRL+C,这将允许你检查情况,看看发生了什么

  • 如果查找不够:选择导致错误的行并点击f9

  • 如果仍然没有找到错误,请放置一个条件断点,该断点仅在到达发生错误的条件/之后触发。如果多次达到这个目标,你不知何故陷入了一个循环


  • 旁注:如果你不确定自己是否在一个循环中,Matlab的最新版本有一个自动格式化按钮,请使用它

    谢谢!如何检查内存泄漏?什么是
    path2script
    ?老实说,我对MATLAB知之甚少。通过这样做,你也许可以给自己更多的记忆:。。。如果你粘贴一些脚本,我可以试着看看是否有任何东西看起来非常低效。你没有一个错误的电话来暂停在那里,是吗?不,我没有。我猜可能是内存问题,我看到使用的内存一直在增加,但是当它暂停时,没有关于这个的消息。它总是相同的迭代吗?定义“卡住”:脚本是否返回MATLAB提示符?或者挂起,所以您必须手动终止它?它是否产生任何错误或警告信息?我认为这与内存无关,但这当然取决于具体情况。点击Ctrl-\以获取java堆栈转储并发布它。它可以帮助我们解决这个问题。