2016-01-21 13 views
11

Recentemente quando si aggiunge il debugger per il mio codice python 2.7.10, ottengo questo messaggio:Bdbquit sollevata quando il debug python

Traceback (most recent call last): 
    File "/Users/isaachess/Programming/vivint/Platform/MessageProcessing/vivint_cloud/queues/connectors/amqplib_connector.py", line 191, in acking_callback 
    callback(message.body) 
    File "/Users/isaachess/Programming/vivint/Platform/MessageProcessing/vivint_cloud/queues/consumable_message_queue.py", line 32, in deserialized_callback 
    self._callback_method(msg) 
    File "/Users/isaachess/Programming/vivint/Platform/BusinessLogic/businesslogic/util/statsd_util.py", line 95, in _time_func 
    retVal = f(*args, **kwargs) 
    File "/Users/isaachess/Programming/vivint/Platform/MessageProcessing/vivint_cloud/net/router.py", line 226, in handle 
    try: 
    File "/Users/isaachess/Programming/vivint/Platform/MessageProcessing/vivint_cloud/net/router.py", line 226, in handle 
    try: 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/bdb.py", line 49, in trace_dispatch 
    return self.dispatch_line(frame) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/bdb.py", line 68, in dispatch_line 
    if self.quitting: raise BdbQuit 
BdbQuit 

Questo è dopo aver inserito le righe:

import pdb; pdb.set_trace()

in il codice.

Non riesco a capire perché questo sta accadendo. Ho letto su Bdb e Bdbquit, ma non riesco a capire perché questo sta accadendo nel mio codice. Qualcuno può fornirmi qualche suggerimento sul perché questo accada in generale? I veramente voglio riavviare il debugger.

+3

Come si esegue il processo? La mia ipotesi è che il tuo processo non sia collegato a un terminale o qualcosa di simile. È un sottoprocesso o qualcosa del genere? – shx2

+0

@ shx2, sottoprocesso? Potrebbe in qualche modo l'uso di [Luigi] (https://pypi.python.org/pypi/luigi) causare questo? –

risposta

6

Se si continua dal (pdb) tempestiva e consentire il codice per terminare normalmente, non mi aspetto di uscita come il traceback hai indicato, ma se si esce pdb, con il quit comando o^D (EOF), una traceback come quello accade perché non c'è niente per catturare l'eccezione BdbQuit sollevata quando il debugger si chiude. In bdb.pyself.quitting viene impostato su con il metodo set_quit (e con le clausole finally nei vari metodi di esecuzione). Metodi di spedizione chiamati da trace_dispatchraise BdbQuit quando self.quitting è True e la clausola tipica except: per BdbQuit è una semplice istruzione pass; pdb eredita tutto da gdb.

In breve, la gestione delle eccezioni viene utilizzata per disabilitare la funzione di traccia del sistema utilizzata dal debugger, quando l'interazione del debugger termina in anticipo.

Un modo per evitare completamente questo traceback è utilizzare pdb in modo diverso. Anziché chiamare pdb.set_trace() dal codice (e non gestire affatto BdbQuit), è possibile richiamare il codice entro pdb (anziché viceversa), a quel punto l'eccezione BdbQuit verrà gestita come previsto da pdb. Ciò consentirà anche di scegliere le posizioni dei punti di interruzione senza modificare il codice (utilizzando il comando breakpdb). O puoi mescolare i due approcci; esegui il tuo codice sotto pdb, pdb.set_trace() e tutte le chiamate, e quelle chiamate saranno punti di interruzione che è possibile rimuovere solo modificando il codice.

È possibile richiamare il codice entro pdb utilizzando il comando pdb con la chiamata di script come argomenti della riga di comando o con python -m pdb.

+0

sarebbe bello se potessi specificare le possibili cause di BdbQuit come pdb non lo solleva in alcuni script. – Alex

+0

questa non è la risposta completa, ci sono molte altre limitazioni di 'pdb' come se non potesse funzionare in un pool multiprocesso e così via. Non riesci a menzionarli. –

-1

Mi sono imbattuto in questo quando ho lasciato import pdb e un pdb.set_trace() nel mio codice di produzione. Fondamentalmente nulla era lì per sempre c ontinue il codice in modo che alla fine errore fuori. Mi sento come un nocciolone.

0

Oltre alla risposta di Eirik Fuller, vorrei aggiungere che non è possibile utilizzare pdb in qualcosa in esecuzione in un processo diverso. Per il debug puoi controllare questa risposta: https://stackoverflow.com/a/23654936/7806805 ma sembra molto hackerata o puoi far funzionare il tuo programma in un singolo thread. Consultare la documentazione: https://docs.python.org/3/library/concurrent.futures.html. Per problemi di multiprocessing potresti anche voler passare attraverso https://www.reddit.com/r/learnpython/comments/46x9sm/why_is_pdbset_trace_crashing_whenever_it_is_in_an/

In ogni caso la tua domanda manca del contesto tanto necessario. Si prega di aggiungere alla tua domanda.

Problemi correlati