2013-03-08 13 views
11

Edit: Wirklich zu schätzen, Hilfe bei der Suche nach Bug - aber da es möglicherweise schwer zu finden/zu reproduzieren, würde jede allgemeine Debug-Hilfe auch sehr geschätzt werden! Hilf mir, mir selbst zu helfen! =)Wie Python-Speicherfehler zu debuggen?

Edit 2: Eingrenzen, Code auskommentieren.

Edit 3: Es scheint, dass lxml nicht der Schuldige sein kann, danke! Das vollständige Skript lautet here. Ich muss darüber nach Referenzen suchen. Wie sehen Sie aus?

Bearbeiten 4: Eigentlich sind die Skripte stoppen (geht zu 100%) in dieser, derparse_ogTeil davon. Also editieren 3 ist falsch - es muss irgendwie lxml sein.

Edit 5 MAJOR EDIT: Wie unten von David Robinson und TankorSmash vorgeschlagen, ich habe eine Art von data Inhalt gefunden lxml.etree.HTML(data) in einer wilden Schleife senden. (I nicht berücksichtigte es nachlässig, aber finde meine Sünden erlöst, wie ich einen Preis in Höhe von zwei zusätzlichen Tagen des Debug bezahlt habe;!) A working crashing script is here.(Also opened a new question.)

bearbeiten 6: Stellt sich heraus, das ist ein Fehler mit Lxml Version 2.7.8 und darunter (unter am wenigsten). Updated to lxml 2.9.0, und der Fehler ist weg. Danke auch an den fein Leute bei this follow-up question.

Ich weiß nicht, wie dieses seltsame Problem zu debuggen, das ich habe. Der unten stehende Code läuft ungefähr fünf Minuten lang, wenn der RAM plötzlich vollständig gefüllt ist (von 200 MB bis 1700 MB während der 100% -Periode - dann, wenn der Speicher voll ist, geht es in den blauen Wartezustand).

Es ist aufgrund des Codes unten, insbesondere die ersten beiden Zeilen. Das ist sicher. Aber was ist los? Was könnte dieses Verhalten möglicherweise erklären?

def parse_og(self, data): 
    """ lxml parsing to the bone! """ 
    try: 
     tree = etree.HTML(data) # << break occurs on this line >> 
     m = tree.xpath("//meta[@property]") 

     #for i in m: 
     # y = i.attrib['property'] 
     # x = i.attrib['content'] 
     # # self.rj[y] = x # commented out in this example because code fails anyway 


     tree = '' 
     m = '' 
     x = '' 
     y = '' 
     i = '' 

     del tree 
     del m 
     del x 
     del y 
     del i 

    except Exception: 
     print 'lxml error: ', sys.exc_info()[1:3] 
     print len(data) 
     pass 

enter image description here

+1

Können Sie die HTML-Daten verknüpfen, damit wir den Code auch testen können? – TankorSmash

+0

'Daten' sind die ersten 5000 Bytes eines HTML-Dokuments. – knutole

+1

Nicht schwierig, aber Sie haben es mit einer Vielzahl von Seiten versucht, und es ist egal, welche Daten Sie weitergeben? – TankorSmash

Antwort

3

Sie Low-level Python debugging with GDB versuchen. Wahrscheinlich gibt es einen Fehler im Python-Interpreter oder in der lxml-Bibliothek und es ist schwierig, ihn ohne zusätzliche Tools zu finden.

Sie können Ihr unter gdb laufendes Skript unterbrechen, wenn die CPU-Auslastung 100% erreicht und die Stack-Verfolgung überprüft. Es wird wahrscheinlich helfen zu verstehen, was im Skript vor sich geht.

2

es aufgrund einiger Referenzen, die die Dokumente am Leben zu halten sein müssen. Man muss immer vorsichtig mit String-Ergebnissen aus der XPath-Auswertung sein. Ich sehe, Sie haben None zu tree und m aber nicht zu y, x und i zugewiesen.

Sie können None auch y, x und i zuweisen.

+0

Danke! Habe es einfach ausprobiert. Entschuldigung, dasselbe Ergebnis. – knutole

+1

haben Sie versucht, 'del' auf all diesen zu verwenden? –

+0

Ja, kein Glück. Vielen Dank! Aktualisierte Frage. – knutole

2

Tools sind auch hilfreich beim Aufspüren von Speicherproblemen. Ich habe guppy gefunden, um ein sehr nützliches Python-Speicherprofilierungs- und -erforschungstool zu sein.

Es ist nicht leicht, mit dem Anfang zu beginnen, weil es keine guten Tutorials/Dokumentationen gibt, aber sobald Sie damit vertraut sind, werden Sie es sehr nützlich finden.Funktionen, die ich nutzen:

  • Fernspeicher Profilierung (über Sockets)
  • Grund GUI für den Einsatz Charting, optional Live-Daten
  • Leistungsstarke und konsistente, Schnittstellen für die Erkundung der Datennutzung in einem Python zeigt shell
+0

Danke dafür. Können Sie mit diesem Tool "verlorene" Referenzen finden? – knutole

+1

@knutole: Mit etwas Mühe, ja. Sie können Momentaufnahmen des Speicherstatus erstellen (d. H. Vor und nach dem vermuteten Auslöser für Ihr Problem) und sie vergleichen. So können Sie nur die Änderungen sehen. Von dort können Sie den kürzesten Weg zwischen dem globalen Geltungsbereich und dem gewünschten Objekt erhalten. – RobM