Domanda

Abbiamo un'applicazione Linux che utilizza i collegamenti Python di OpenSSL e sospetto che stia causando crash casuali. Occasionalmente, vediamo che si blocca con il messaggio:

  

Errore irreversibile di Python: oggetto GC già tracciato

che sembrerebbe essere un errore di programmazione da parte della libreria o un sintomo di corruzione della memoria. C'è un modo per conoscere l'ultima riga del codice sorgente di Python che ha eseguito, dato un file core? O se è collegato in GDB? Mi rendo conto che probabilmente è tutto compilato dal bytecode, ma spero che qualcuno là fuori abbia potuto occuparsene. Attualmente è in esecuzione con il modulo di traccia attivo e speriamo che accada di nuovo, ma potrebbe richiedere molto tempo.

È stato utile?

Soluzione

Sì, puoi fare questo tipo di cose:

(gdb) print PyRun_SimpleString("import traceback; traceback.print_stack()")
  File "<string>", line 1, in <module>
  File "/var/tmp/foo.py", line 2, in <module>
    i**2
  File "<string>", line 1, in <module>
$1 = 0

Dovrebbe anche essere possibile usare il comando pystack definito nel python gdbinit , ma non funziona per me. È discusso qui se vuoi esaminarlo.

Inoltre, se sospetti problemi di memoria, vale la pena notare che puoi utilizzare valgrind con Python, se sei pronto a ricompilarlo. La procedura è descritta qui.

Altri suggerimenti

Se hai in giro mac o sun box puoi usare dtrace e una versione di python compilato con dtrace per capire cosa stava facendo l'applicazione in quel momento. Nota: in 10.5 python è pre-compilato con dtrace che è davvero bello e utile.

Se questo non è disponibile per te, puoi importa gc e abilita il debug che puoi quindi inserire in un file di registro.

Per rispondere in modo specifico alla tua domanda sul debug con GDB, potresti voler leggere " Debugging with GDB " sul wiki di Python.

Se stai usando CDLL per avvolgere una libreria C in Python, e questo è Linux a 64 bit, ci sono buone probabilità che il tuo wrapper CDLL sia configurato male. Per impostazione predefinita, CDLL restituisce i tipi int su tutte le piattaforme (dovrebbe essere lungo sui sistemi a 64 bit) e si aspetta solo che passi gli argomenti giusti. In questo caso potrebbe essere necessario verificare il wrapper CDLL ...

Oltre a quanto sopra, è possibile implementare rapidamente un tracciante adhoc tramite modulo di traccia .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top