[英]How to debug C extensions for Python on Windows
所以我能夠通過使用Visual Studio 2008成功解決我的問題。我松散地按照這里列出的步驟 -
http://www.velocityreviews.com/forums/t329214-debugging-python-extensions.html
這里有一些關於解決方法的提示 -
以下是我可能遇到此問題的其他人的步驟版本。
如果您還沒有,請確保在VS中設置Python頭和libs目錄
一個。 轉到工具>選項>項目和解決方案> VC ++目錄 。 請務必分別將include和libs路徑添加到Include和Library文件的路徑中。 (例如C:\\Python27\\include
, C:\\Python27\\libs
)
轉到Python include文件夾(再次,例如C:\\Python27\\include
)並編輯pyconfig.h
。 注釋掉# define Py_DEBUG
並保存。 轉到您的libs文件夾(如C:\\Python27\\libs
),並副本python27.lib
。 將副本命名為python27_d.lib
。
創建一個新項目。 選擇Win32 Project並將其命名為模塊名稱(在我的例子中為pyodbc
。單擊Next,然后選擇DLL for Application type並選中Empty Project 。
在解決方案資源管理器中,右鍵單擊“頭文件”,然后選擇“添加”>“現有項”。 選擇所需的所有頭文件。 對源文件執行相同操作。
轉到項目>屬性 ,然后在配置屬性下 -
一個。 常規 - 確保使用正確的字符集 。 對我來說,它是Use Multi-Byte Character Set
。 Python 3可能需要Use Unicode Character Set
。
灣 調試 - 在命令字段中輸入Python的路徑。 (例如C:\\Python27\\python.exe
)。 然后將Attach設置為Yes
。
C。 鏈接器>常規 - 將輸出文件更改為以.pyd
而不是.dll
結尾。
確保您的配置設置為Debug。 轉到Build> Build Solution 。
打開cmd並cd
到編譯pyd
文件的目錄中。 從cmd窗口啟動python。 要在此運行的python進程上附加調試器,請返回Visual Studio並單擊綠色播放按鈕以開始調試。 您還可以使用Debugging - > Attach to Process ...現在返回Python並導入您的模塊。 玩,測試,並嘗試打破它!
此工作流將為Release版本創建調試信息,因此您不必弄亂Python的原始包含和庫文件。
下載並安裝Windows調試工具
獲取Python版本的符號文件並將其解壓縮。 對於Python 2.7.3,這將是http://www.python.org/ftp/python/2.7.3/python-2.7.3-pdb.zip 。
修改setup.py
以生成調試文件。 你必須將'/Zi'
添加到extra_compile_args
並將'/DEBUG'
到extra_link_args
。 例:
ext_modules = [Extension('pyuv', sources=['src/pyuv.c'], extra_compile_args=['/Zi'], extra_link_args=['/DEBUG']) ]
一如既往地構建擴展( python setup.py ...
)。
啟動WinDbg並指定符號搜索路徑(Ctrl + S)。
C:\\Path\\To\\Extension_pdb C:\\Path\\To\\Extracted\\python-2.7.3-pdb srv*;SRV*c:\\tmp*http://msdl.microsoft.com/download/symbols
最后一行將下載並緩存Windows模塊所需的符號。
啟動Python可執行文件(Ctrl + E)。 您可以直接執行腳本或以交互模式運行。
使用“Go”跳過初始斷點(F5)。
如果存在分段錯誤,則執行將中斷,您將在WinDbg控制台中看到類似訪問沖突的內容 - 代碼c0000005(第一次機會) 。
您可以通過在WinDbg控制台中鍵入!analyze -v
以及使用kb
鍵入當前堆棧跟蹤來獲取詳細的異常信息。 這是一個這樣的輸出的例子。
如果省略第二步並使用Release配置構建項目,您應該能夠將此方法與pyrospade用Visual Studio調試的答案相結合。
可以在這里找到WinDbg的進一步教程。
Segfaults特別神秘,因為沒有辦法從Python代碼中捕獲它們,甚至無法在C端獲取大量的堆棧跟蹤信息。 至少可以為您提供更多信息的一件事是使用Google breakpad C庫在發生段錯誤時報告C堆棧跟蹤。
您可能想嘗試使用David Malcolm的工具CPyChecker
,它可以靜態分析內存泄漏和其他錯誤的C擴展。 該工具記錄在此處 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.