【问题标题】:running script stop in the middle运行脚本在中间停止
【发布时间】:2010-01-26 15:49:05
【问题描述】:

我有一个脚本进行一些计算并将一些不可见的图保存到 linux 服务器上 for 循环内的图像文件中。

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

我只是想知道如何确定它停在哪条线?

问题的原因可能是什么以及如何从头到尾运行整个脚本?

谢谢!


更新:

我使用 dbstop

dbstop if error  
dbstop if warning  
run path2script

运行仍然卡在某个地方,没有给出任何消息说明原因。

【问题讨论】:

  • 你没有错误地调用 PAUSE,是吗?
  • 不,我不知道。猜想可能是内存问题,我看到使用的内存一直在增加,但是当它暂停时没有关于此的消息。
  • 总是相同的迭代吗?定义“卡住”:脚本是否返回到 MATLAB 提示符?或者挂起,所以你必须手动终止它?它会产生任何错误或警告信息吗?我不认为这与内存有关,但当然取决于情况。
  • 按 Ctrl-\ 获取 java 堆栈转储并发布。它可以帮助我们找出问题。

标签: matlab


【解决方案1】:

这是找出发生了什么的一种方法:

  1. 开启dbstop if error
  2. 一旦你的代码真的卡住了,按下 CTRL+C,这将允许你检查情况并看看发生了什么

  3. 如果看不够:选择引发错误的行并按 f9。

  4. 如果您仍然没有找到错误,请放置一个条件断点,该断点仅在您达到错误发生期间/之后的条件后触发。如果多次达到此目标,您就会以某种方式陷入循环。

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

【讨论】:

    【解决方案2】:

    这是什么类型的脚本?

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

    我建议检查内存泄漏。

    【讨论】:

    • 谢谢!如何检查内存泄漏?
    • path2script 是什么?老实说,我对 MATLAB 了解不多。您可以通过执行以下操作来给自己更多的内存:mathworks.com/support/solutions/en/data/1-18I2C/index.html ... 如果您粘贴一些脚本,我可以尝试看看是否有任何看起来非常低效的东西。
    【解决方案3】:

    当您的脚本“卡住”时,究竟会发生什么?它是退出到提示符,还是 matlab 只是挂起?如果是后者,那么听起来你的代码中有一个无限循环......

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        正如 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
        

        如果您的脚本在没有断点的情况下被卡住,但如果您使用断点然后继续,则可以愉快地继续超过该点,这通常表明您遇到了与时间相关的零星故障,可能是竞争条件。也许您正在向操作系统写入文件,然后立即查看操作系统以找出下一个文件的名称应该是什么,但是您的文件系统正在稍微缓存?这样的事情给我带来了类似的问题。

        仔细查看您的代码在每次循环中执行的操作,以了解可能依赖于它之前的步骤的任何可能异步运行的操作。

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2013-12-21
              • 1970-01-01
              • 2021-06-20
              • 1970-01-01
              • 2015-03-07
              • 2012-07-29
              • 2013-11-15
              相关资源
              最近更新 更多