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


210

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

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

更新

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

  • Google Chrome(v22)运行脚本。如果脚本提交了HTTP请求,则显示该请求的HTTP响应。原始页面未刷新。
  • IE 9只是冻结。但是IE有一个选项“ Stop Debugging”(停止调试),如果按下该按钮(前提是您之前没有按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年多的浏览量和近1万次浏览,Alexander K给出了正确的答案。Google Chrome浏览器具有自己的任务管理器,可以关闭制表符进程而无需关闭制表符本身,而使所有断点和其他内容保持完整。

我什至到BrowserStack.com都在Chrome v22中对其进行了测试,发现即使在那时,这种方式也能正常工作。

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

更新(2019年1月)

最后,Chrome开发者工具添加了一种停止脚本执行的正确方法,这很好(尽管有些隐蔽)。有关详细信息,请参阅James Gentes的答案。


12
键入debugger;到开发者工具控制台,它会立刻把东西放到调试器和停止脚本。
2015年

3
James Gentes的答案似乎是2019
Spikolynn

1
为什么每个人都在谈论停止脚本?这是关于终止/破坏所有“跟随/程序化”的代码。
安德烈·埃里科

Answers:


188

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

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

您可以选择页面任务并按“结束进程”按钮结束它。


4
chrome 48这只会关闭开发工具,而不会终止它,而是重新打开它,您可以看到程序仍在运行(tried setInterval()
Abdelouahab

11
我没有在“更多工具”下看到“任务管理器”,并且shift + esc却什么也不做...(Chrome 50,OSX)Shift + ESC确实可以在Chrome / Windows下工作...
Michael

2
哇,我已经想要了这么久,而且已经存在了很多年!这是我一年四季见过的最有用的StackOverflow答案!
Michael Scheper

4
在Macintosh(Chrome v.63)上,此选项显示在第三组的“窗口”菜单下。没有明显的键盘快捷键。
阿波罗

2
这将杀死选项卡
htafoya

105

2018年4月起,您可以在Chrome中停止无限循环

  1. 在开发人员工具(+ + **)中打开“ 源”面板。CtrlShiftI
  2. 单击“ 暂停”按钮以暂停脚本执行

另请注意快捷键:F8Ctrl+\

在此处输入图片说明


UI上的隐藏宝石。
诺伯特

答题者拥有了解宇宙秘密的钥匙。
山姆

当您有一个无限运行的脚本要停止以检查控制台时,该快捷方式特别有用。谢谢。
阿列克谢

@DanDascalescu,我安装了Chrome 80.0.3987.149,看起来也一样
James Gentes

也许我们正在以不同的执行状态查看按钮?我的想法是,我在body此处选择了元素,设置了“中断->子树修改”,然后单击任意位置。该按钮类似于我发布的屏幕截图。
Dan Dascalescu

37

一种实现方法是暂停脚本,查看当前停止的位置后面的代码,例如:

var something = somethingElse.blah;

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

delete somethingElse;

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

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


3
you have to delete a function or an object真讨厌!(在用户界面中,就像杀死所有按钮一样非常合适)
Mars Robertson 2014年

这很讨厌,但我想不出另一种方法。
juacala 2015年

一年后,我又回到了同样的问题……而且我无法弄清楚!有没有办法使它更通用?
火星罗伯逊2015年

您不知道如何终止脚本执行?我一直能够做到这一点。您是否有一个示例不允许您以此方式终止脚本?
juacala 2015年

1
@Hashim,您需要能够在函数内部放置一个断点。因此,请确保函数内部与函数定义在单独的行上。对于您的情况,您需要在控制台中将其暂停后,键入“ document.getElementById('see_older')。parentNode.removeChild(document.getElementById('see_older'));“。这是因为您在javascript中没有任何东西可以中断。不幸的是,这也改变了HTML。如果您可以将代码更改为“ var el = document.getElementById('see_older'); \ n el.getEl ...”,则只需执行“删除el;”。这将阻止它。
juacala

12

2020年4月更新

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

停止在Chrome DevTools中执行脚本


2
感谢上帝!OP的问题的真实答案。
user1023110

1
@ user1023110:我不了解上帝,但是不客气:)
Dan Dascalescu

5

如果您在使用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月左右)


3

好问题在这里。我认为您无法终止脚本执行。尽管我从没有寻找过它,但在使用Chrome调试器的过程中已经使用了很长时间了。我通常在javascript代码中设置断点,然后调试感兴趣的代码部分。完成调试代码后,通常只运行程序的其余部分或刷新浏览器。

如果您想阻止脚本的其余部分执行(例如,由于将要进行的AJAX调用),您唯一可以做的就是在控制台中即时删除该代码,从而防止这些调用从执行开始,那么您可以执行其余代码而不会出现问题。

我希望这有帮助!

PS:我尝试在一些类似以下的教程/指南中找到终止执行的选项,但找不到它。正如我之前所说,可能没有这样的选择。

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

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


我有帮助吗?似乎没有终止选项,但是为了防止执行以下代码,您可以在Chrome调试器中对其进行注释或删除以下代码/调用“实时”(此后一个选项将使继续按钮成为可能)。表现像终止)。我知道它们不是理想的解决方案,但我认为它们是最可接受的解决方案。任何意见?
罗曼·罗德里格斯·吉尔

1
在许多情况下,需要阻止执行的代码在调用堆栈中(这些函数将在当前函数返回后获得控制)。当然,我可以在调用堆栈中编辑函数,然后查找和编辑所有可能被异步调用的函数。我敢肯定,如果在按下“页面刷新”按钮时脚本仍处于暂停状态,则浏览器在脚本仍处于暂停状态的情况下刷新页面将是一件微不足道的事情。我还认为,对于任何浏览器来说,这都应该是预期的行为(不幸的是,并非如此)。
srgstm,2012年

2
实际上,我找到了一种解决方案来实现脚本执行的终止!:在chrome中,我打开调试器来调试我的一个应用程序,并设置了一个断点。我运行页面。执行在断点处暂停。然后,我检查问题并意识到是什么导致了该错误。要终止执行,我单击URL旁边的X按钮(以停止页面加载),然后在继续执行脚本(F8)时将终止执行。我认为,这是实现该目标的简单方法。您如何看待这个?
罗曼·罗德里格斯·吉尔

加载页面后,Chrome中的X按钮将替换为刷新按钮,因此以后无法再按X(我也曾在IE中尝试过它,它一直都有X可用,但总是死机)。我还测试了您在页面加载期间的建议,并发现按X再按F8后脚本不会终止。按下X时尚未加载到浏览器中的脚本很可能之后没有加载,但这应该是显而易见的。
srgstm,2012年

哦,您是对的,这是一个快速测试,并且没有代表性...那么,似乎没有解决方案。
罗曼·罗德里格斯·吉尔

3

参照@scottndecker对以下问题的回答,chrome现在在开发人员工具下提供了“禁用JavaScript”选项:

  • ...右上垂直
  • 设定值
  • 在“首选项”下,转到最底部的“调试器”部分,然后选择“禁用JavaScript”

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


1
如果您因在开发者工具菜单和Chrome菜单之间感到困惑而
投票反对,

没为我工作。我选中了“禁用JavaScript”框,但是脚本一直保持运行状态。
Paul Gorbas

1

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

在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)继续执行脚本。脚本将return false执行上述步骤(2)中的测试


笔记:

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

(B)因此,如果您具有全局变量或对象(如果它具有给定的值将返回false。

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


更多说明:

(a)将断点插入代码:只需键入 debugger;一行即可。如果打开了DevTools,脚本将在此时跳入调试器。如果未打开DevTools,则代码将忽略语句。

(b)想要避免在调试代码时跳入jQuery库吗?黑匣子吧。查看Chrome的黑盒说明 -或-Firefox


感激(请访问并投票):

使用Google Chrome浏览器逐行进行JavaScript调试

在Google Chrome浏览器中调试时是否可以更改javascript变量值?


2
Any place where you may wish to quit, test the value of this variable那太糟了!我想退出目前可能会踩到的任何地方,但我事先不知道可能在哪里!
迈克尔

如果您愿意在代码方面进行工作,那么这是尝试停止脚本执行的客户端上最用户友好的操作。

??? 您不需要任何全局变量。只需单击此按钮
Dan Dascalescu

0

您可以暂停任何XHR模式,这在调试此类情况下非常有用。

例如,我在包含“ /”的URL模式上给出了断点

在此处输入图片说明


0

如果您有恶意循环,请暂停Google Chrome调试器中的代码(“ ||源”标签中的小“ ”按钮)。

切换回Chrome本身,打开“任务管理器”(Shift+ ESC),选择您的标签,然后单击“结束进程”按钮。

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

正如其他人指出的那样,在暂停时重新加载页面与重新启动恶意循环相同,并且如果调试器随后也锁定(在某些情况下会导致重新启动chrome甚至是PC),则可能导致讨厌的锁定。调试器需要一个“停止”按钮。Nb:公认的答案已经过时,因为它的某些方面现在显然是错误的。如果您不赞成我,请解释一下:)



-1

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


-1

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

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

当您点击时,这将导致执行暂停F12


如果您(希望)不使用jQuery怎么办?
Dan Dascalescu

然后用纯JavaScript,像document.addEveneListner ..得到keydown事件..
穆尔塔扎·侯赛因
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.