【问题标题】:How to identify and terminate a javascript in infinite loop programmatically?如何以编程方式识别和终止无限循环中的javascript?
【发布时间】:2014-05-22 04:35:29
【问题描述】:

这更像是一个假设性问题。有时 javascript 代码有可能进入无限循环并在开发的早期阶段特别阻塞所有内容。我知道最好的解决方案是编写代码,这样这种情况就不会出现,但是如果在某种情况下不可能编写完整的代码(可能是因为我们无法控制输入或其他东西)怎么办。

我们有什么方法可以通过编程确定代码何时处于无限循环并终止它?

可能会在单独的线程或子进程中同步运行可能发生此类事情的代码片段,并确定该线程/进程何时处于无限循环中。

一个人怎么能做到这一点?是否可以通过单独确定线程(主线程或子线程)的 CPU 使用率来确定线程(主线程或子线程)何时处于无限循环中?

根据下面在 cmets 中的讨论,我意识到仅根据跟踪类似语句的重复执行和高资源利用率来识别阻塞无限循环是不可能的。所以我认为解决方案在于两者的结合。但这又回到了我们之前的问题。我们如何通过脚本来衡量 CPU 使用率?

【问题讨论】:

  • 这是您经常遇到的问题吗?即使是这样,一个很好的判断方法是浏览器是否无响应,然后提供终止您的脚本。
  • 它被称为停机问题并在此处阅读描述en.wikipedia.org/wiki/Halting_problem。简而言之,对于某些给定的输入,永远无法确定程序是否终止
  • @dlev 虽然我面临这样的问题,但它们总是很容易解决。主要是我自己的错误。我问的问题更多是出于假设的原因。而且我只想以编程方式为该线程执行此操作,而不是页面中的所有脚本
  • 不确定你所说的“只有那个线程”是什么意思,javascript是单线程的,这就是问题所在,你用永远不会完成的错误代码阻塞了那个线程,当线程被阻塞时你真的没有任何方法可以运行更多的 javascript 来解决阻塞问题,因为唯一的线程被阻塞了。这通常不是问题,因为以这种方式阻塞线程的脚本发生是因为开发人员犯了一个错误,解决它的唯一方法是修复错误代码。
  • 不,没有,一旦你犯了这样的错误,浏览器就会停止响应,并且在javascript中你无法判断浏览器是否停止响应,或者做任何事情。同样,唯一的解决方案是确保不会发生这种情况,这应该不是很难做到的。

标签: javascript infinite-loop


【解决方案1】:

对于简单的循环,您可以使用 here 的方法。它使用基于路径的方法来检测无限循环。语句被视为图的节点。

你也可以看到这个paper。他们已经为 java 程序实现了运行时解决方案。

【讨论】:

    【解决方案2】:

    鉴于没有提出其他可行/复杂的解决方案,一个低技术的解决方案是只使用一个计数器,如果它达到一个荒谬的高数字则中止。

    这需要手动编码,但当您知道无限循环已经发生时,它可以用于调试无限循环。

    var count = 0
    
    while(true){
      if(count++>100000){
          //assume infinite loop, exit to avoid locking up browser while debugging
          break;
      }
    }
    

    【讨论】:

    • 一个不错的解决方法,但有明显的缺点。如果循环的主体包含一些非常昂贵的代码(资源利用方面),那么当我们达到这个荒谬的数字时,浏览器已经变得无响应了。
    • 这个解决方案没有什么意义:为什么还要用计数器来混乱你的代码呢?页面变得无响应,并且 c) 如果您要花时间,不妨花时间实际分析您的代码是否正确。
    • 这只是临时调试代码,当您彻底解决问题后可以将其删除。有时可能会涉及复杂的/3rd-party/异步库,这需要几次尝试才能正确解决。添加和删​​除此代码所需的 20 秒编码时间有时可能有助于避免重复的脚本超时和浏览器锁定。当“无限”循环条件为真时,您还可以设置断点进行调试。
    • 如果无限循环是一个问题,那么代码是不完整的。这就是为什么我提出了一种解决方案来有效地调试潜在问题的原因。
    猜你喜欢
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    • 2021-06-30
    • 2011-08-26
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    相关资源
    最近更新 更多