如何在Google Chrome中调试时终止脚本执行?

时间:2012-10-30 07:51:14

标签: javascript debugging google-chrome-devtools

在Google Chrome调试程序中单步执行JavaScript代码时,如果我不想继续,如何终止脚本执行?我找到的唯一方法是关闭浏览器窗口。

按“重新加载此页面”将运行其余代码,甚至提交表单,就像按F8“继续”一样。

更新

在脚本暂停时按F5(刷新):

  • Google Chrome(第22版)运行该脚本。如果脚本提交HTTP请求,则会显示该请求的HTTP响应。原始页面未刷新。
  • IE 9刚冻结。但IE有一个选项“停止调试”,当按下时(如果你之前没有按F5),继续在调试器外运行脚本。
  • Firebug的行为与Chrome相同。

关闭然后再次打开浏览器窗口并不总是下一个最简单的方法 因为它会终止浏览器会话状态,这可能很重要。你的所有断点都会丢失。

更新(2014年1月)

调试时刷新:

  • Chrome v31:允许脚本在其他断点上运行和停止(但不提交ajax请求),然后刷新。
  • IE 11:刷新无效,但您可以按F5继续。
  • Firefox v26:让脚本运行但不会停留在更多断点上,提交ajax请求,然后刷新。

有点进步!

调试时导航到同一页面:

  • Chrome v31:与刷新相同。
  • IE 11:脚本终止,新的浏览器会话启动(与关闭和再次打开相同)。
  • Firefox v26:没有任何反应。

此外, juacala 提出了有效的解决方法。例如,如果您使用的是jQuery,则一旦遇到任何jQuery方法,从控制台运行 delete $ 将停止执行。我已在所有上述浏览器中对其进行了测试,并确认它正在运行。

更新(2015年3月)

最后,经过2年以上和近10K次观看,Alexander K给出了正确的答案。谷歌Chrome有自己的任务管理器可以杀死标签进程,而不用关闭标签本身,保持所有的断点和其他东西都完好无损。

我甚至到了BrowserStack.com,在Chrome v22中测试它,发现即使在那个时候这也是这样的。

在IE或Firefox中进行调试时,Juacala的解决方法仍然有用。

更新(2019年1月)

Chrome Dev Tools最后添加了一种正确的方法来停止脚本执行,这很好(虽然有点隐藏)。有关详细信息,请参阅James Gentes的答案。

13 个答案:

答案 0 :(得分:168)

在Chrome中,有“任务管理器”,可通过 Shift + ESC 或通过

访问
  

菜单→更多工具→任务管理器

您可以选择页面任务,然后按“结束处理”按钮结束。

答案 1 :(得分:42)

截至April 2018, you can stop infinite loops in Chrome

  1. 打开来源面板。
  2. 点击暂停。该按钮将更改为恢复脚本执行
  3. 按住继续执行脚本,然后选择停止当前的JavaScript调用

答案 2 :(得分:37)

你可以做的一种方法是暂停脚本,查看当前停止的代码,例如:

var something = somethingElse.blah;

在控制台中,执行以下操作:

delete somethingElse;

然后播放脚本:当它尝试访问somethingElse时会导致致命错误,并且脚本将会死亡。瞧,你已经终止了剧本。

编辑:最初,我删除了一个变量。这还不够好。您必须删除JavaScript尝试访问属性的函数或对象。

答案 3 :(得分:33)

2020年4月更新

从Chrome 80开始,当前的答案均无效。没有可见的“暂停”按钮-您需要长按“播放”按钮以访问“停止”图标:

Stop script execution in Chrome DevTools

答案 4 :(得分:4)

请参阅@scottndecker给出的以下question的答案,chrome现在在开发人员工具下提供了“禁用JavaScript”选项:

  • 右上角的...
  • 设置
  • 在“偏好设置”下,转到最底部的“调试器”部分,然后选择“禁用JavaScript”

好的是你可以通过选中/取消选中它来停止并重新运行。

答案 5 :(得分:3)

这里有个好问题。我认为你无法终止脚本执行。虽然我从来没有找过它,但我一直在使用chrome调试器工作很长时间。我通常在我的javascript代码中设置断点,然后调试我感兴趣的代码部分。当我完成调试代码时,我通常只运行程序的其余部分或刷新浏览器。

如果你想阻止脚本的其余部分被执行(例如由于将要进行的AJAX调用),你唯一能做的就是在控制台上删除该代码。飞行,从而阻止执行这些调用,然后您可以毫无问题地执行剩余的代码。

我希望这有帮助!

P.S:我试图在一些教程/指南中找到一个终止执行的选项,如下所示,但找不到它。正如我之前所说,可能没有这样的选择。

http://www.codeproject.com/Articles/273129/Beginner-Guide-to-Page-and-Script-Debugging-with-C

http://www.nsbasic.com/app/tutorials/TT10.htm

答案 6 :(得分:3)

如果您在使用debugger语句时遇到此问题,

debugger;

...然后我认为该页面将继续运行,直到js运行时产生或下一次休息。假设您处于突破错误模式(暂停图标切换),您可以通过执行以下操作来确保中断:

debugger;throw 1;

或者可以调用不存在的函数:

debugger;z();

(当然,如果您尝试单步执行功能,这不会有帮助,但也许您可以在“源”面板中动态添加throw 1z()或某些内容,ctrl- S要保存,然后按ctrl-R刷新...但是这可能会跳过一个断点,但如果你在一个循环中可能会有效。)

如果您正在进行循环并希望再次触发debugger语句,则只需键入throw 1即可。

throw 1;

然后当你点击ctrl-R时,下一个投掷将被点击,页面将刷新。

(使用Chrome v38测试,大约2017年4月)

答案 7 :(得分:2)

您可以这样做,但您必须先准备好代码。

暂停Google Chrome开发工具中脚本执行的说明:

(1)首先通过创建 全局 变量来准备代码:

var devquit=0;
$(document).ready({
    //the rest of your code

(2)您可能希望退出的任何地方,测试此变量的值:

//Lotsa code
if (devquit > 0) return false;

(3)暂停在上述测试行之前或之前执行脚本

(4)切换到控制台

(5)输入:

> devquit
0
> devquit=1   <=== only this line is necessary
> devquit
1

(6)继续执行脚本。当脚本从上面的步骤(2)执行测试时,脚本将return false


注意:

(A)这个技巧适用于全局变量和对象,但它不适用于局部变量。 请注意:
newVar = 'never used before';
创建窗口对象的新属性(使用上述技巧), ,同时:
var newVar = 'never used before';
创建一个局部变量(不适用于上面的技巧!)

(B)所以,你仍然可以在已经运行的代码中使用这个技巧 如果 你有一个全局变量或者一个对象如果有的话会返回false一个给定的值。

(C)在紧要关头,您可以使用juacala的技巧并从DOM中删除元素(在元素选项卡上),这将导致javascript错误。例如,假设您有代码var cartype = $('#cartype').val();如果在该代码行之前删除ID = cartype的元素,则js将在该行中断。 但是,当您尝试重新运行代码时,该元素仍然会丢失。 上述技巧可让您运行并重新运行代码 ad无穷。


更多说明:

(a)在代码中插入断点:只需在一行上输入debugger;。如果DevTools处于打开状态,那么脚本将在此时跳转到调试器。如果DevTools未打开,代码将忽略语句。

(b)在调试代码时想避免跳进jQuery库吗?黑盒子吧。请参阅blackbox instructions for Chrome - 或 - for Firefox


感谢(请访问和upvote):

Javascript Debugging line by line using Google Chrome

Is it possible to change javascript variable values while debugging in Google Chrome?

答案 8 :(得分:1)

如果您有恶意循环,请暂停Google Chrome调试程序中的代码(在“来源”标签中,小&#34; ||&#34;按钮)。

切换回Chrome本身,打开&#34;任务管理器&#34; (Shift + ESC),选择您的标签,点击&#34;结束流程&#34;按钮。

您将收到Aww Snap消息,然后您可以重新加载(F5)。

正如其他人所说,在暂停时重新加载页面与重新启动恶意循环相同,如果调试器也会锁定(在某些情况下导致重新启动chrome甚至是PC),可能会导致令人讨厌的锁定)。调试器需要一个&#34; Stop&#34;按钮。 Nb:接受的答案是过时的,因为它的某些方面现在显然是错误的。如果你投票给我,请解释:)

答案 9 :(得分:0)

在“开发者工具”中打开源选项卡,单击正在运行的脚本中的行号,这将创建一个断点,调试器将在那里中断。

答案 10 :(得分:0)

你可以暂停任何我认为在调试这些场景时非常有用的XHR模式。

例如,我在包含“/”

的网址格式上给出了断点

enter image description here

答案 11 :(得分:0)

如上所述,对于这篇文章,有许多适当的解决方案,但我发现了一个可以在脚本中插入或粘贴在Chrome控制台(调试器)中的小型黑客来实现:

jQuery(window).keydown(function(e) { if (e.keyCode == 123) debugger; });

这将导致在您按下F12时暂停执行。

答案 12 :(得分:-4)

大部分时间我都想停止一个循环或计时器,它正在改变页面上的元素并阻止我检查它们......

大多数时候它使用jQuery所以我只使用:

删除jQuery