Como sair do PDB e permitir que o programa continue?

111

Estou usando o módulo PDB para depurar um programa. Gostaria de entender como posso sair do pdb e permitir que o programa continue até a conclusão. O programa é caro para ser executado, portanto, não quero sair sem que o script tente ser concluído. continuenão parece funcionar. Como posso sair do pdb e continuar com meu programa?

tartaruga
fonte
2
continuesai de loops, returnsai de métodos / funções
Stephan
7
@Stephan: Ele está falando sobre continueo comando pdb. Não é a declaração Python.
voithos
1
@turtle: continuedeve "Continuar a execução, só parar quando for encontrado um ponto de interrupção", de acordo com os documentos. Você tem um ponto de interrupção definido que está sendo atingido?
voithos
1
ah. OK eu vejo. Sim, tenho um ponto de interrupção definido dentro de um loop. Alguma forma de contornar isso? o loop é chamado milhares de vezes, então não posso continuar pressionando manualmente para continuar.
tartaruga de
1
@turtle: Você tem um ponto de interrupção definido de dentro do Pdb ou tem um pdb.set_trace()em seu código-fonte?
voithos

Respostas:

190

continuedeve "Continuar a execução, parar apenas quando um ponto de interrupção for encontrado", então você tem um ponto de interrupção definido em algum lugar. Para remover o ponto de interrupção (se você o inseriu manualmente):

(Pdb) break
Num Type         Disp Enb   Where
1   breakpoint   keep yes   at /path/to/test.py:5
(Pdb) clear 1
Deleted breakpoint 1
(Pdb) continue

Ou, se estiver usando pdb.set_trace(), você pode tentar isso (embora se você estiver usando pdb de maneiras mais sofisticadas, isso pode quebrar as coisas ...)

(Pdb) pdb.set_trace = lambda: None  # This replaces the set_trace() function!
(Pdb) continue
# No more breaks!
voithos
fonte
10
O acima exposto não sair APO.
Steve Barnes
7
Sobre a 15ª palavra da pergunta!
Steve Barnes
13
@SteveBarnes: Acho que você está interpretando muito literalmente. O OP está apenas atingindo um ponto de interrupção continuamente. Tudo o que eles precisam é continuar seu processo de longa duração sem atingir os pontos de interrupção. Se o Pdb está ou não em execução é irrelevante.
voithos
35
Boa dica sobre a configuração set_trace = lambda: None:)
randlet
2
Para os casos extremos, nada bate set_trace = lambda: None. Python org deve adicionar um comando que apenas permite que você saia do pdb.
ErezO
26

Um simples Ctrl- Dsairá do PDB. Se você quiser continuar ao invés de interromper, basta pressionar cao invés de todo o continuecomando

Minh Triet
fonte
6
E quando você está dentro de uma função, dentro de um loop? Parece que vai para o próximo loop para mim, e não consigo realmente fechar o pdb, ou mesmo fechar o python, sem fechar o terminal inteiro?
Marte,
@LimokPalantaemon Estranho, você tentou digitarexit
Minh Triet
Isso não funciona se você definir um traço ou se tiver pontos de interrupção, a menos que continue a pressionar c.
Alex
embaraçoso, mas isso me salvou de ficar preso por muito tempo -_-
jmcg
7

A resposta de @voithos está correta, então adicionarei apenas uma alternativa no caso em que você está usando set_trace. Sim, o pdb.set_trace = lambda: Nonehack funciona bem, mas não se você tiver outros pontos de interrupção definidos e quiser reativá-lo mais tarde. Para mim, isso aponta para o fato de que, infelizmente, pdbestá faltando um monte de funcionalidades (mesmo coisas básicas como listas de exibição), e este é outro caso.

A boa notícia é que ele pdb++é um ótimo substituto imediato pdbe uma das coisas que ele resolve é exatamente o problema da desativação set_trace. Então você pode simplesmente fazer:

pip install pdbpp

e no (Pdb++)prompt, digite:

pdb.disable()

Se você deseja reativar mais tarde, sem surpresa, isso funciona:

pdb.enable()

Fácil! E você receberá muitas outras coisas úteis além disso.

Adam Spires
fonte
4

Se você realmente deseja sair do depurador, você precisa executar algo como o WinPdb, que permite que você se desconecte do processo e, em seguida, saia do depurador (NB: é multiplataforma).

Se quiser continuar a depuração, mas não parar mais em um determinado ponto de interrupção, você precisa:

  1. Anote o número do ponto de interrupção (ou o número do arquivo e da linha),
  2. De qualquer cl bp_number ou clear file:line para remover permanentemente o ponto de interrupção ou disable pb_number para desativá-lo, mas ser capaz de alternar-lo de volta.
  3. Em seguida, continuee seu programa executado até então, o próximo ponto de interrupção diferente é atingido.

Para obter mais detalhes sobre o acima, consulte o manual .

Steve Barnes
fonte
0

encontre uma nova maneira de sair do pdb sem instalar nada: - quando o programa começar a ser executado, pressione ctrl + c, então mude a janela para outra (qualquer janela), então o shell original com pdb rodando deve mostrar algo como: (pdb) ..... - volte para pdb e pressione Enter, agora está tudo pronto, o shell de comando pdb reaparece novamente

BrainAtom
fonte