簡體   English   中英

如何在Windows上調試Python的C擴展

[英]How to debug C extensions for Python on Windows

我在pyodbc中遇到段錯誤問題 ,想在Windows XP x86中調試它。 但是,在線信息似乎主要以Linux為中心。 最好的方法是什么?

所以我能夠通過使用Visual Studio 2008成功解決我的問題。我松散地按照這里列出的步驟 -

http://www.velocityreviews.com/forums/t329214-debugging-python-extensions.html

這里有一些關於解決方法的提示 -

編譯在MSVC上定義的DEBUG的python模塊

以下是我可能遇到此問題的其他人的步驟版本。

  1. 如果您還沒有,請確保在VS中設置Python頭和libs目錄

    一個。 轉到工具>選項>項目和解決方案> VC ++目錄 請務必分別將include和libs路徑添加到Include和Library文件的路徑中。 (例如C:\\Python27\\includeC:\\Python27\\libs

  2. 轉到Python include文件夾(再次,例如C:\\Python27\\include )並編輯pyconfig.h 注釋掉# define Py_DEBUG並保存。 轉到您的libs文件夾(如C:\\Python27\\libs ),並副本python27.lib 將副本命名為python27_d.lib

  3. 創建一個新項目。 選擇Win32 Project並將其命名為模塊名稱(在我的例子中為pyodbc 。單擊Next,然后選擇DLL for Application type並選中Empty Project

  4. 在解決方案資源管理器中,右鍵單擊“頭文件”,然后選擇“添加”>“現有項”。 選擇所需的所有頭文件。 對源文件執行相同操作。

  5. 轉到項目>屬性 ,然后在配置屬性下 -

    一個。 常規 - 確保使用正確的字符集 對我來說,它是Use Multi-Byte Character Set Python 3可能需要Use Unicode Character Set

    調試 - 在命令字段中輸入Python的路徑。 (例如C:\\Python27\\python.exe )。 然后將Attach設置為Yes

    C。 鏈接器>常規 - 將輸出文件更改為以.pyd而不是.dll結尾。

  6. 確保您的配置設置為Debug。 轉到Build> Build Solution

  7. 打開cmd並cd到編譯pyd文件的目錄中。 從cmd窗口啟動python。 要在此運行的python進程上附加調試器,請返回Visual Studio並單擊綠色播放按鈕以開始調試。 您還可以使用Debugging - > Attach to Process ...現在返回Python並導入您的模塊。 玩,測試,並嘗試打破它!

使用WinDbg調試工作流程

此工作流將為Release版本創建調試信息,因此您不必弄亂Python的原始包含和庫文件。

  1. 下載並安裝Windows調試工具

  2. 獲取Python版本的符號文件並將其解壓縮。 對於Python 2.7.3,這將是http://www.python.org/ftp/python/2.7.3/python-2.7.3-pdb.zip

  3. 修改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']) ] 
  4. 一如既往地構建擴展( python setup.py ... )。

  5. 啟動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模塊所需的符號。

  6. 啟動Python可執行文件(Ctrl + E)。 您可以直接執行腳本或以交互模式運行。

  7. 使用“Go”跳過初始斷點(F5)。

  8. 如果存在分段錯誤,則執行將中斷,您將在WinDbg控制台中看到類似訪問沖突的內容 - 代碼c0000005(第一次機會)

  9. 您可以通過在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM