ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

更新:

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

Google Chrome (v22) 运行该脚本。如果脚本提交 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,从控制台运行 delete $ 将在遇到任何 jQuery 方法时停止执行。我已经在上述所有浏览器中对其进行了测试,并且可以确认它可以正常工作。

更新(2015 年 3 月):

最后,经过 2 年多和近 1 万次浏览,Alexander K 给出了正确答案。谷歌浏览器有自己的任务管理器,可以在不关闭标签本身的情况下终止标签进程,保持所有断点和其他内容完好无损。

我什至跑到 BrowserStack.com 在 Chrome v22 中对其进行测试,发现即使在当时也是如此。

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

更新(2019 年 1 月):

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

在开发工具控制台中输入 debugger;,它会立即将内容放入调试器并停止脚本。
James Gentes 的回答似乎是 2019 年更好的解决方案
为什么每个人都在谈论停止脚本?这是关于终止/破坏所有“跟随/计划”的代码。
同意 Andre:对于希望在不丢失窗口的情况下终止当前 Javascript 执行的人 - 下面的 Dan Dascalescu 给出了答案。
@Jake 你拯救了我的一天......简单而直接......非常感谢......

E
Evan Carroll

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

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

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


chrome 48这只会关闭开发工具,不会终止它,重新打开它,您可以看到程序仍在运行(tried setInterval()
我在“更多工具”下看不到“任务管理器”,而 shift+esc 什么也不做……(Chrome 50,OSX) Shift+ESC 确实在 Chrome/Windows 下工作……
哇——我想要这个很久了,而且它已经存在多年了!这是我一年来见过的最有用的 StackOverflow 答案!
在 Macintosh (Chrome v.63) 上,此选项显示在“窗口”菜单的第三组中。没有明显的键盘快捷键。
这将杀死标签
R
ROOT

April 2018, you can stop infinite loops in Chrome 开始:

在开发者工具中打开 Sources 面板 (Ctrl+Shift+I**)。单击暂停按钮以暂停脚本执行。

还要注意快捷键:F8 和 Ctrl+\

https://i.stack.imgur.com/8nhl2.png


该用户界面上的隐藏宝石。
回答者有一把打开宇宙秘密的钥匙。
当您有一个无限运行的脚本要停止以检查控制台时,该快捷方式特别有用。谢谢。
@DanDascalescu 我有 Chrome 80.0.3987.149,它看起来一样
在我的情况下,使用 requestAnimationFrame(),Chrome 会继续工作,因此无论脚本是否暂停,CPU 使用率都是 100%。
D
Dan Dascalescu

2020年4月更新

从 Chrome 80 开始,当前的答案都不起作用。没有可见的“暂停”按钮 - 您需要长按“播放”按钮才能访问停止图标:

https://i.stack.imgur.com/68C8K.png


感谢上帝!对OP问题的真正答案。
@user1023110:我不了解上帝,但不客气:)
我没有看到停止图标
@SuperUberDuper您必须按下播放/暂停并等待下拉菜单出现,然后拖动光标停止图标然后释放。
我希望我可以多次投票!这是对 OP 问题的真正答案,至少在 Chrome 再次更新并[重新]移动此功能之前...
U
Ulf Gjerdingen

您可以这样做的一种方法是暂停脚本,查看您当前停止的位置后面的代码,例如:

var something = somethingElse.blah;

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

delete somethingElse;

然后播放脚本:尝试访问somethingElse时会出现致命错误,脚本会死掉。瞧,你已经终止了脚本。

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


you have to delete a function or an object 如此讨厌的 hack! (在 UI 中,它很适合作为 kill all 按钮)
这很讨厌,但我想不出其他方法。
一年后我又回到了同样的问题......我无法弄清楚!有没有办法让它更通用?
您无法弄清楚如何终止脚本执行?我一直都能做到这一点。您是否有一个不允许您以这种方式杀死脚本的示例?
@Hashim,您需要能够在函数内放置一个断点。因此,请确保函数内部与函数定义位于不同的行上。在您的情况下,您需要在控制台中,一旦暂停,键入“document.getElementById('see_older').parentNode.removeChild(document.getElementById('see_older'));”。这是因为您在 javascript 中没有任何东西可以破解。不幸的是,这也改变了 HTML。如果您可以将代码更改为“var el = document.getElementById('see_older');\n el.getEl...”,那么您可以执行“delete el;”这将阻止它。
n
ninjagecko

[2022 年编辑:这在 2017 年被报告为 https://bugs.chromium.org/p/chromium/issues/detail?id=774852https://bugs.chromium.org/p/chromium/issues/detail?id=1112863,最近才被标记为 5 年后修复,因此如果您仍然遇到此问题,您应该更新 Chrome(以及一般保持更新)。如果您在 2023 年或以后遇到此问题,则可能是不同的问题、错误回归等]

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

debugger;

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

debugger;throw 1;

或者可能调用一个不存在的函数:

debugger;z();

(当然,如果您尝试单步执行函数,这无济于事,但也许您可以在 Sources 面板中动态添加 throw 1z() 或类似的东西,按 ctrl-S 保存,然后按 ctrl-R刷新...但是,这可能会跳过一个断点,但如果您处于循环中,则可能会起作用。)

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

throw 1;

然后当你按下 ctrl-R 时,下一个 throw 就会被击中,并且页面会刷新。

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


R
Roland Pihlakas

参考 @scottndecker 对以下 question 的回答,chrome 现在在开发者工具下提供了“禁用 JavaScript”选项:

Vertical ... 在右上角(在开发者工具菜单中,而不是在 Chrome 主菜单中)

设置(在较新的 Chrome 版本中,除了 ... 按钮之外,它作为齿轮单独可见,而不是在它下面)

在“首选项”下,转到最底部的“调试器”部分并选择“禁用 JavaScript”

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


如果您因为对开发者工具菜单和 Chrome 菜单感到困惑而投了反对票,那将是非常可悲的 :(
没有为我工作。我选中了禁用 JavaScript 框,但脚本仍在运行。
R
Romén Rodríguez-Gil

好问题在这里。我认为你不能终止脚本执行。虽然我从来没有找过它,但我在工作中使用 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 调试器中调用“live”(后一个选项将使继续按钮表现得像一个终止)。我知道它们不是理想的解决方案,但我认为它们是最容易接受的解决方案。任何意见?
在许多情况下,需要阻止执行的代码位于调用堆栈(在当前函数返回后将获得控制权的函数)。当然,我可以在调用堆栈中向上编辑函数,然后查找并编辑所有可能被异步调用的函数。我敢肯定,如果在按下“页面刷新”按钮时它被暂停,浏览器刷新页面而脚本仍处于暂停状态肯定是一件微不足道的事情。我还认为这应该是任何浏览器的预期行为(不幸的是,它不是)。
实际上我找到了一种解决方法来实现脚本执行的终止!:在 chrome 中,我打开调试器来调试我的一个应用程序并设置了一个断点。我运行页面。执行在断点处暂停。然后我检查问题并了解导致错误的原因。要终止执行,我单击 URL 旁边的 X 按钮(停止页面加载),然后在继续执行脚本 (F8) 时它将终止。我认为,实现它的方法相当简单。你觉得这个怎么样?
Chrome 中的 X 按钮在页面加载后被刷新按钮替换,因此之后无法按 X(我也在 IE 中尝试过它,它确实有 X 始终可用,但它总是冻结)。我还在页面加载期间测试了您的建议,发现按 X 和 F8 后脚本没有终止。很可能在按下 X 时尚未加载到浏览器中的脚本之后不会加载,但这应该是显而易见的。
哦,你是对的,这是一个快速测试,不具有代表性......然后似乎没有解决方案。
L
Liam

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

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

https://i.stack.imgur.com/F4ZTZ.png


R
ROOT

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

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

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

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


有一个better way
T
Todd

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


M
Murtaza Hussain

这篇文章上面提到了这个问题有很多合适的解决方案,但我发现了一个小技巧,可以插入脚本中或粘贴到 Chrome 控制台(调试器)中来实现它:

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

这将导致在您点击 F12 时暂停执行。


如果你(希望)不使用 jQuery 怎么办?
然后使用纯 Javascript,如 document.addEveneListner.. 来获取 keydown 事件..