Gewusst wie: Debuggen von C-Erweiterungen für Python unter Windows
Ich habe eine problem mit einem segfault in pyodbc und würde gerne Debuggen, um in Windows XP x86. Die Informationen können aber online scheint in Erster Linie Linux-centric. Was ist der beste Weg zu gehen über diese?
- Ich gebe zu, ich habe nie versucht, zu debug-Python-C-Erweiterung, die auf Windows, aber Sie haben versucht, das Anhängen eines Debuggers an das Python-Prozess?
- Soweit Debuggen, Ihr problem, du hast geschrieben am StackOverflow und auf PyODBC. Das ist gut so. Ich habe die Freiheit genommen hinzufügen ein Kopfgeld auf Ihre Frage. Soweit das "Debuggen im Allgemeinen" - wenn Sie sich wohl fühlen mit MSVS - dann mit allen Mitteln versuchen, den Wiederaufbau und sehen, was passiert. Ich vermute, du wirst wahrscheinlich traurig sein... IMHO..
- Einige Hinweise: Installieren und aktivieren von faulthandler. Installieren Sie einen debugger für Windows, z.B. Visual Studio 2008. Downloaden und installieren Sie das Python-Programm-Datenbank PDB-Dateien für Ihre Python version, z.B.
python-2.7.3-pdb.zip
aushttp://www.python.org/ftp/python/2.7.3/
. Rebuild pyodbc mit debug-Symbolen mit der msvc9 compiler. Hinzufügen/DEBUG
zuldflags_shared
und/Zi
zucompile_options
imPython27\Lib\distutils\msvc9compiler.py
Du musst angemeldet sein, um einen Kommentar abzugeben.
So konnte ich erfolgreich beheben mein Problem mit Visual Studio 2008. Ich lose anschließend die Schritte aufgelistet hier -
http://www.velocityreviews.com/forums/t329214-debugging-python-extensions.html
Und einige Tipps, workarounds hier -
Zusammenstellung von python-Modulen, mit DEBUG definiert MSVC
Hier ist meine version der Schritte, für alle anderen, die dieses problem auftreten.
In den Fall, Sie nicht bereits haben, werden Sie sicher, dass setup die Python-header und libs-Verzeichnisse in VS
ein. Gehen Sie zu Extras > Optionen > Projekte und-Lösungen > VC++ - Verzeichnisse. Werden Sie sicher, dass Sie Ihre include und libs Pfad zu den Include-und Bibliothek-Dateien " - Pfad, beziehungsweise. (z.B.
C:\Python27\include
,C:\Python27\libs
)Gehen, um Ihre Python-Ordner einbeziehen (mal wieder, z.B.
C:\Python27\include
) und Bearbeitenpyconfig.h
. Kommentieren Sie die Zeile# define Py_DEBUG
und sparen. Gehen Sie zu Ihrem Ordner libs (z.B.C:\Python27\libs
) und eine Kopie derpython27.lib
. Benennen Sie die Kopiepython27_d.lib
.Erstellen Sie ein neues Projekt. Wählen Sie Win32-Projekt und nennen Sie den Namen des Moduls (in meinem Fall
pyodbc
. Klicken Sie auf Nächsten dann wählen Sie DLL für Anwendung Typ und überprüfen Leeres Projekt.Im Projektmappen-Explorer mit der rechten Maustaste auf die Header-Dateien und wählen Sie " Hinzufügen > Vorhandenes Element. Wählen Sie alle header-Dateien, die Sie benötigen. Tun Sie das gleiche für die Source-Dateien.
Gehen Projekt - > Eigenschaften, dann unter Konfiguration Eigenschaften -
ein. Allgemeinen - stellen Sie sicher, dass Sie den richtigen Zeichensatz. Für mich war es
Use Multi-Byte Character Set
. Python 3 muss wahrscheinlichUse Unicode Character Set
.b. Debugging - geben Sie den Pfad zu Python in der Befehl Feld. (z.B.
C:\Python27\python.exe
). Legen Sie dann Befestigen zuYes
.c. Linker > Allgemeine - ändern Sie die Ausgabe-Datei Ende
.pyd
statt.dll
.Sicherzustellen, dass Ihre Konfiguration Debuggen. Gehen Sie zu Build - > Build-Lösung.
Öffnen Sie ein cmd und
cd
in das Verzeichnis, wo Ihrepyd
- Datei kompiliert wurde. Starten Sie python aus dem cmd Fenster. Zum Anhängen des Debuggers auf das ausführen von python-Prozess, wechseln Sie zurück zu Visual Studio, und klicken Sie auf den grünen "play" - Taste, um das Debuggen zu starten. Sie können auch Debugging -> an den Prozess Anhängen... Jetzt gehen Sie zurück zu Python-und import-Modul. Spielen, testen, und versuchen Sie, es zu brechen!Debuggen von workflow-mit WinDbg
Diesem workflow wird das erstellen von debugging-Informationen, die für eine Freigabe erstellen, so dass Sie
nicht zu verwirren haben mit der original-include-und Bibliothek-Dateien von Python.
Herunterladen und installieren Debugging Tools für Windows
Holen Sie sich die symbol-Dateien für Ihre Python-version aus und extrahieren Sie Sie. Für Python
2.7.3 das wäre http://www.python.org/ftp/python/2.7.3/python-2.7.3-pdb.zip.
Ändern
setup.py
zum generieren von debugging-Dateien. Sie'/Zi'
zuextra_compile_args
und'/DEBUG'
zuextra_link_args
. Beispiel:Build der Erweiterung, wie immer (
python setup.py ...
).Starten Sie WinDbg, und geben Sie das Symbol Suchen Pfad (Strg + S).
Der letzten Zeile wird der download-und cache benötigten Symbole für Windows-Module.
Starten Sie den Python-executable (Strg + E). Sie können sich direkt ausführen
Skript oder führen Sie im interaktiven Modus.
Überspringen die erste Haltepunkt mit "Go" (F5).
Wenn es ein "Segmentation fault" die Ausführung wird brechen und Sie wird
finden Sie etwas, das wie Zugriffsverletzung - code c0000005 (erste chance)
in der WinDbg-Konsole.
Erhalten Sie detaillierte Informationen über die Ausnahme von der Eingabe
!analyze -v
in der WinDbg-Konsole und den aktuellen stack-trace mit
kb
.Hier ist ein
Beispiel für eine solche Ausgabe.
Sollten Sie in der Lage sein zu kombinieren diesen Ansatz mit pyrospade ist
Antwort zum Debuggen mit
Visual Studio, wenn du weglassen, seinen zweiten Schritt, und erstellen Sie das Projekt mit
Release Konfiguration.
Eine weitere Anleitung für WinDbg gefunden werden konnte hier.
'/Od'
zuextra_compile_args
zu deaktivieren OptimierungSegfaults sind besonders geheimnisvoll, da es keine Möglichkeit gibt, Falle für Sie von Ihrem Python-code, oder sogar um viel stacktrace-Informationen auf die C-Seite der Dinge. Eine Sache, die kann geben Sie zumindest ein wenig mehr info ist die Verwendung der Google breakpad C-Bibliothek zu melden, C stack-trace, wenn der segfault Auftritt.
faulthandler
(in stdlib seit 3.3) kann die trap-sigserv und print tracebackfaulthandler
- Werke, auf Python 2.Möchten Sie vielleicht, um zu versuchen, David Malcolm ' s tool
CPyChecker
die statisch Analysen von C-Erweiterungen für Speicherlecks und andere Fehler. Das tool ist hier dokumentiert.