Como encerrar a execução de scripts ao depurar no Google Chrome?

210

Ao percorrer o código JavaScript no depurador do Google Chrome, como encerro a execução do script se não quero continuar? A única maneira que encontrei é fechar a janela do navegador.

Pressionar "Recarregar esta página" executa o restante do código e até envia formulários como se estivesse pressionando F8 "Continuar".

ATUALIZAÇÃO :

Ao pressionar F5 (Atualizar) enquanto um script está em pausa:

  • O Google Chrome (v22) executa o script. Se o script enviar uma solicitação HTTP, a resposta HTTP para essa solicitação será exibida. A página original não é atualizada.
  • IE 9 apenas congela. No entanto, o IE tem uma opção "Stop Debugging" que, quando pressionada (desde que você não tenha pressionado F5 anteriormente), continua executando o script fora do depurador.
  • O Firebug se comporta de maneira idêntica ao Chrome.

Fechar e abrir novamente a janela do navegador nem sempre é a próxima maneira mais fácil, pois isso mata o estado da sessão do navegador e isso pode ser importante. Todos os seus pontos de interrupção também são perdidos.

ATUALIZAÇÃO (jan de 2014) :

Atualizar durante a depuração:

  • Chrome v31: permite que scripts sejam executados e interrompidos em outros pontos de interrupção (mas não envia solicitações de ajax) e, em seguida, é atualizado.
  • IE 11: a atualização não faz nada, mas você pode pressionar F5 para continuar.
  • Firefox v26: permite que scripts sejam executados, mas não para em mais pontos de interrupção, envia solicitações de ajax e atualiza.

Tipo de progresso!

Navegue para a mesma página durante a depuração:

  • Chrome v31: o mesmo que Atualizar.
  • IE 11: scripts são encerrados, nova sessão do navegador é iniciada (o mesmo que fechar e abrir novamente).
  • Firefox v26: nada acontece.

A juacala também sugeriu uma solução alternativa eficaz. Por exemplo, se você estiver usando jQuery, executando delete $ do console interromperá a execução assim que qualquer método jQuery for encontrado. Eu testei em todos os navegadores acima e posso confirmar que está funcionando.

ATUALIZAÇÃO (mar de 2015) :

Finalmente, após mais de 2 anos e quase 10 mil visualizações, a resposta certa foi dada por Alexander K. O Google Chrome possui seu próprio Gerenciador de Tarefas, que pode interromper um processo de aba sem fechar a própria aba, mantendo todos os pontos de interrupção e outras coisas intactas.

Até fui ao BrowserStack.com para testá-lo no Chrome v22 e descobri que isso estava funcionando dessa maneira, mesmo naquele momento.

A solução alternativa de Juacala ainda é útil ao depurar no IE ou Firefox.

ATUALIZAÇÃO (Jan 2019) :

Finalmente, as Ferramentas de Desenvolvimento do Chrome adicionaram uma maneira adequada de interromper a execução de scripts, o que é bom (embora um pouco oculto). Consulte a resposta de James Gentes para obter detalhes.

srgstm
fonte
12
digite debugger;no console das ferramentas de desenvolvimento e ele imediatamente colocará as coisas no depurador e interromperá o script.
Jake
3
A resposta de James Gentes parece ser uma solução melhor em 2019
Spikolynn
1
Por que todo mundo está falando em parar o script? Trata-se de encerrar / quebrar todo o código "seguinte / programado" que está por vir.
Andre Elrico

Respostas:

188

No Chrome, existe o "Gerenciador de tarefas", acessível por Shift+ ESCou por

Menu → Mais Ferramentas → Gerenciador de Tarefas

Você pode selecionar a tarefa da página e finalizá-la pressionando o botão "Finalizar processo".

Alexander K
fonte
4
chrome 48isto só irá fechar a ferramenta Dev, e não terminá-lo, reabri-lo, você pode ver o programa ainda está em execução ( tried setInterval())
Abdelouahab
11
Eu não vejo "Gerenciador de tarefas" em "Mais ferramentas" e shift + esc não faz nada ... (Chrome 50, OSX) Shift + ESC funciona no Chrome / Windows, embora ... #
Michael
2
Uau - eu quero isso há tanto tempo, e está lá há anos! Esta é a resposta mais útil do StackOverflow que eu já vi o ano todo!
Michael Scheper
4
No Macintosh (Chrome v.63), esta opção é exibida no menu "Janela", no terceiro grupo. Não há atalho de teclado evidente.
Apollo
2
Isso matará a guia
htafoya
105

A partir de abril de 2018, você pode interromper loops infinitos no Chrome :

  1. Abra o painel Origens nas Ferramentas do desenvolvedor ( Ctrl+ Shift+ I**).
  2. Clique no Pause botão para pausar a execução de script .

Observe também as teclas de atalho: F8e Ctrl+\

insira a descrição da imagem aqui

James Gentes
fonte
Uma jóia tão escondida nessa interface do usuário.
Norbert
O atendedor tem uma chave para os segredos do universo.
28419 Sam
O atalho é particularmente útil quando você tem um script em execução sem fim que deseja parar para verificar o console. Obrigado.
Alexei
@DanDascalescu Eu tenho o Chrome 80.0.3987.149 e parece o mesmo
James Gentes
Talvez estejamos olhando para o botão em diferentes estados de execução? O meu é que eu escolhi o bodyelemento aqui no SO, defina uma "quebra em -> modificações na subárvore" e cliquei em qualquer lugar. O botão aparece na captura de tela que eu publiquei.
Dan Dascalescu
37

Uma maneira de fazer isso é pausar o script, observe o código a seguir onde você está atualmente parado, por exemplo:

var something = somethingElse.blah;

No console, faça o seguinte:

delete somethingElse;

Em seguida, toque o script: ele causará um erro fatal ao tentar acessar somethingElse e o script morrerá. Voila, você encerrou o script.

EDIT: Originalmente, eu apaguei uma variável. Isso não é bom o suficiente. Você precisa excluir uma função ou objeto do qual o JavaScript tenta acessar uma propriedade.

juacala
fonte
3
you have to delete a function or an objectum corte tão desagradável! (na interface do usuário que caberia muito bem como matar todos botão)
Mars Robertson
É bastante desagradável, mas não consigo pensar em outra maneira.
juacala
Ano depois, volto à mesma pergunta ... E não consigo entender! Existe uma maneira de torná-lo mais genérico?
Mars Robertson
Você não consegue descobrir como finalizar a execução do script? Eu sempre fui capaz de fazer isso. Você tem um exemplo que não permite que você mate o script dessa maneira?
juacala 14/07/2015
1
@Hashim, você precisa colocar um ponto de interrupção dentro da função. Portanto, verifique se o interior da função está em uma linha separada da definição da função. No seu caso, você precisará no console, depois de pausar, digite "document.getElementById ('see_older'). ParentNode.removeChild (document.getElementById ('see_older'));". Isso ocorre porque você não tem nada em javascript para interromper. Infelizmente, isso também altera o HTML. Se você pode alterar o código para "var el = document.getElementById ('ver_oldador'); \ n el.getEl ...", basta fazer "delete el;" e isso vai parar.
21155 juacala
12

Atualização de abril de 2020

No Chrome 80, nenhuma das respostas atuais funciona. Não existe um botão "Pausar" visível - você precisa clicar com o botão "Play" para acessar o ícone Parar:

Interromper a execução de scripts no Chrome DevTools

Dan Dascalescu
fonte
2
Graças a Deus! Uma resposta real à pergunta do OP.
user1023110 3/04
1
@ user1023110: Eu não sei sobre Deus, mas de nada :)
Dan Dascalescu 03/04
5

Se você encontrar isso enquanto usa a debuggerinstrução,

debugger;

... então acho que a página continuará sendo executada para sempre até o tempo de execução do js render, ou a próxima interrupção. Supondo que você esteja no modo de interrupção do erro (alternar entre o ícone de pausa), você pode garantir que uma interrupção aconteça ao fazer algo como:

debugger;throw 1;

ou talvez chame uma função inexistente:

debugger;z();

(Claro que isso não ajuda se você está tentando passo através de funções, embora talvez você poderia adicionar dinamicamente em um throw 1ou z()ou algo assim no painel de Fontes, ctrl-S para salvar, e depois ctrl-R para atualizar ... este no entanto, pode pular um ponto de interrupção, mas pode funcionar se você estiver em um loop.)

Se você está executando um loop e espera acionar a debuggerinstrução novamente, basta digitar throw 1.

throw 1;

Então, quando você pressionar ctrl-R, o próximo lançamento será atingido e a página será atualizada.

(testado com o Chrome v38, por volta de abril de 2017)

ninjagecko
fonte
3

Boa pergunta aqui. Eu acho que você não pode terminar a execução do script. Embora eu nunca tenha procurado por isso, uso o depurador chrome há muito tempo no trabalho. Normalmente, defino pontos de interrupção no meu código javascript e, em seguida, depuro a parte do código em que estou interessado. Quando termino de depurar esse código, normalmente apenas executo o restante do programa ou atualizo o navegador.

Se você deseja impedir que o restante do script seja executado (por exemplo, devido a chamadas AJAX que serão feitas), a única coisa que você pode fazer é remover esse código no console imediatamente, impedindo essas chamadas de ser executado , você poderá executar o código restante sem problemas.

Eu espero que isso ajude!

PS: Tentei encontrar uma opção para encerrar a execução em alguns tutoriais / guias como os seguintes, mas não consegui encontrá-la. Como eu disse antes, provavelmente não existe essa opção.

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

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

Romén Rodríguez-Gil
fonte
Eu ajudei? Parece que não há uma opção de encerramento, mas para impedir a execução do código a seguir, você pode comentá-lo antes ou excluir o seguinte código / chamada "ativo" no depurador do Chrome (essa última opção fará o botão continuar) comportar-se como um terminador). Sei que não são soluções ideais, mas acho que são as mais aceitáveis. Algum comentário?
Romén Rodríguez-Gil 30/10/12
1
Em muitos casos, o código que precisa ser impedido de executar é a pilha de chamadas (as funções que obterão controle após o retorno da função atual). Claro, eu posso editar funções na pilha de chamadas e, em seguida, localizar e editar todas as funções que podem ser chamadas de forma assíncrona. Tenho certeza de que deve ser uma coisa trivial para um navegador atualizar uma página com o script ainda no estado de pausa SE foi interrompido no momento em que o botão Atualizar Página foi pressionado. Eu também acho que deve ser um comportamento esperado para qualquer navegador (infelizmente não é).
Srgstm 31/10/12
2
Na verdade, encontrei uma solução alternativa para alcançar o término da execução do script !: No chrome, abro o depurador para depurar um dos meus aplicativos e defino um ponto de interrupção. Eu corro a página. A execução faz uma pausa no ponto de interrupção. Depois, examino o problema e percebo o que está causando o erro. Para finalizar a execução , clique no botão X ao lado do URL (para interromper o carregamento da página) e, em seguida, ao continuar o script (F8), ele será finalizado. Maneira bastante fácil de conseguir isso, eu acho. O que você acha desse aqui?
Romén Rodríguez-Gil
O botão X no Chrome é substituído pelo botão Atualizar depois que uma página é carregada, portanto não há como pressionar X depois (eu também tentei no IE, que tem X disponível o tempo todo, mas invariavelmente congela). Também testei sua sugestão durante o carregamento da página e descobri que o script não termina após pressionar X e F8. É provável que os scripts que ainda não foram carregados no navegador no momento em que o X foi pressionado não sejam carregados posteriormente, mas isso deve ser evidente.
Srgstm 31/10/12
Ah, você está certo, foi um teste rápido e não foi representativo ... Então parece que não há solução.
Romén Rodríguez-Gil
3

Referindo-se à resposta dada por @scottndecker à seguinte pergunta , o chrome agora fornece uma opção 'desativar JavaScript' em Ferramentas do desenvolvedor:

  • Vertical ...no canto superior direito
  • Configurações
  • E em 'Preferências', vá para a seção 'Depurador' na parte inferior e selecione 'Desativar JavaScript'

O bom é que você pode parar e executar novamente apenas marcando / desmarcando.

theFreedomBanana
fonte
1
Se você downvote porque você está confuso entre menu de Developer Tools e menu do Chrome é muito triste :(
theFreedomBanana
Não funcionou para mim. Marquei a caixa Desativar JavaScript, mas o script continua em execução.
Paul Gorbas
1

Você pode fazer isso, mas você deve preparar seu código primeiro.

Instruções para interromper a execução de scripts nas Ferramentas de Desenvolvimento do Google Chrome:

(1) Prepare seu código primeiro, criando uma variável global :

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

(2) Qualquer local onde você queira sair, teste o valor desta variável:

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

(3) Pausar a execução do script antes ou antes da (s) linha (s) de teste acima

(4) Alterne para o console

(5) Tipo:

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

(6) Continue a execução do script. O script será return falsequando executar o teste da etapa (2) acima


Notas:

(A) Esse truque funciona com variáveis ​​e objetos globais, mas não funciona com variáveis ​​locais. Observe que isto:
newVar = 'never used before';
cria uma nova propriedade do objeto de janela (funciona com o truque acima), enquanto isso:
var newVar = 'never used before';
cria uma variável local (NÃO funciona com o truque acima!)

(B) Portanto, você ainda pode usar esse truque com código já em execução se tiver uma variável global ou um objeto que retornará falso se tiver um determinado valor.

(C) Em uma pitada, você pode usar o truque de juacala e excluir um elemento do DOM (na guia Elementos) que causará um erro de javascript. Por exemplo, suponha que você tenha código var cartype = $('#cartype').val();Se você excluir o elemento com ID = cartypeantes dessa linha de código, os js serão interrompidos nessa linha. No entanto, o elemento ainda estará ausente quando você tentar executar novamente o código. O truque descrito acima permite executar e executar novamente o código ad infinitum.


Mais notas:

(a) Insira o ponto de interrupção no código: basta digitar debugger;uma linha sozinha. Se o DevTools estiver aberto, o script entrará no depurador nesse ponto. Se o DevTools não abrir, o código ignorará a instrução.

(b) Deseja evitar pular para a biblioteca jQuery ao depurar código? Caixa preta. Consulte as instruções da caixa preta para o Chrome - ou - para o Firefox


Gratidão (visite e vote acima):

Depuração de Javascript linha por linha usando o Google Chrome

É possível alterar os valores das variáveis ​​javascript durante a depuração no Google Chrome?

cssyphus
fonte
2
Any place where you may wish to quit, test the value of this variableIsso é horrível! Quero parar onde quer que esteja pisando no momento, não sei de antemão onde isso pode estar!
Michael
Se você deseja colocar o trabalho no lado do código, este é o mais fácil de usar no cliente que tenta interromper a execução do script.
Ganso
??? Você não precisa de nenhuma variável global. Basta clicar neste botão .
Dan Dascalescu 31/03
0

Você pode pausar em qualquer padrão XHR que eu acho muito útil durante a depuração desse tipo de cenário.

Por exemplo, eu dei um ponto de interrupção em um padrão de URL que contém "/"

insira a descrição da imagem aqui

Abhi
fonte
0

Se você tiver um loop não autorizado, pause o código no depurador do Google Chrome (o pequeno ||botão " " na guia Fontes).

Volte ao Chrome, abra "Gerenciador de tarefas" ( Shift+ ESC), selecione sua guia, clique no botão "Finalizar processo".

Você receberá a mensagem Aww Snap e poderá recarregar ( F5).

Como outros observaram, recarregar a página no momento da pausa é o mesmo que reiniciar o loop não autorizado e pode causar bloqueios desagradáveis ​​se o depurador também bloquear (em alguns casos, levando à reinicialização do chrome ou mesmo do PC). O depurador precisa de um botão "Stop". Nota: A resposta aceita está desatualizada, pois alguns aspectos dela estão aparentemente aparentemente errados. Se você me votar, pls explica :) .

www-0av-Com
fonte
1
Existe uma maneira melhor .
Dan Dascalescu 31/03
-1

Abra a guia fonte em 'Developer Tools', clique no número da linha em um script em execução, isso criará um ponto de interrupção e o depurador será interrompido por lá.

Todd
fonte
-1

Há muitas soluções adequadas para esse problema, como mencionado acima neste post, mas eu encontrei um pequeno hack que pode ser inserido no script ou colado no console do Chromes (depurador) para alcançá-lo:

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

Isso fará com que a execução seja pausada quando você pressionar F12.

Murtaza Hussain
fonte
E se você (espero) não usar o jQuery?
Dan Dascalescu 31/03
então use Javascript puro, como document.addEveneListner .. para obter o evento de pressionamento de tecla ..
Murtaza Hussain