Frage

Ich muss ein Vermächtnis zope2 Website laufen und einige Beschwerde mit ihm haben. Das größte Problem ist, dass gelegentlich es sperrt nur auf, bei 100% CPU-Last lief und nicht mehr auf Anfragen zu beantworten. Während das Problem auf einer regelmäßigen Basis nicht reproduzierbar ist, eine Seite, die 3 dynamische Diagramme Trigger es manchmal, so dass ich eine Art von Race-Bedingung, dass führt zu einer Endlos-Schleife oder ein stuck busywait vermuten.

Das Problem ist, ich habe noch keinen Weg gefunden, um dieses Ding zu debuggen. Es gibt nichts in den Zope-Protokollen und nichts in den Systemprotokollen. Ich habe versucht, die Vorschläge von diese Frage einen Stacktrace zu bekommen, aber das einzige Signal, das eine Wirkung hat, ist SIGKILL.

Gibt es eine andere Möglichkeit, um herauszufinden, wo genau der Prozess ist, wenn es klemmt?

War es hilfreich?

Lösung

Wenn der Prozess in einer Art und Weise fest, dass kein anderes Signal durchkommt, könnte man es von einem Debugger betrachten will laufen, anstatt zu versuchen, sie zur Laufzeit zu befestigen.

Auch könnte es auf andere Debug-Taktik nützlich sein, wie aus bestimmten Teilen des Codes Drehen den Minimalfall, um herauszufinden, in denen es noch reproduzierbar ist, um zu sehen, was bewirkt, dass es besser.

Andere Tipps

Sie können mit einem netten Stack-Trace drucken pyrasite .

Als erstes müssen Sie gdb installiert sein.

# Redhat, CentOS, etc
$ yum install gdb

# Ubuntu, Debian, etc
$ apt-get update && apt-get install gdb

Dann installieren pyrasite.

$ pip install pyrasite

Verwenden ps oder eine andere Methode, um den Prozess-ID für den stuck Python-Prozess und führte pyrasite-shell mit ihm zu finden.

# Assuming process ID is 12345
$ pyrasite-shell 12345

Sie sollten nun eine Python REPL sehen. Führen Sie den folgenden in der REPL Stack-Traces für alle Threads zu sehen.

import sys, traceback
for thread_id, frame in sys._current_frames().items():
    print 'Stack for thread {}'.format(thread_id)
    traceback.print_stack(frame)
    print ''

Sehen Sie meine Antwort auf diese Frage SO , verwenden Sie Products.signalstack . Es registriert die gleiche Behandlungsroutine wie die Antwort, die Sie bereits bei Produktregistrierung Zeit gefunden. Vielleicht funktioniert es besser für Sie.

Wenn nicht, haben Sie wahrscheinlich ein OS-Ebene I / O Problem an den Händen haben, und Ihre einzige Hoffnung gdb an den Prozess angefügt wird. Suchen Stack-Überlauf für GDB Antworten; gibt es eine Fülle von Informationen hier!

Sie könnten versuchen, einen Debugger an den laufenden Prozess zu befestigen. Siehe auch diese Frage .

nach dem Laufen um das Internet in Kreisen für eine Weile ich schließlich hier gelandet: http://podoliaka.org/2016/04/10/debugging-cpython-gdb/ - beschreibt im Detail, wie alle Teile zusammenpassen. das Geld Zitat war für mich 'gdb / usr / bin / python -p $ PID.' - der Name der ausführbaren Datei, um für GDB erforderlich ist, um die richtigen Debug-Informationen Dateien finden

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top