如何在Windows上debuggingPython的C扩展

我有一个在pyodbc段错误的问题 ,并希望在Windows XP x86中进行debugging。 但是,在线信息似乎主要是以Linux为中心的。 什么是最好的方式去做这件事?

Solutions Collecting From Web of "如何在Windows上debuggingPython的C扩展"

所以我能够通过使用Visual Studio 2008成功地解决我的问题。我松散地按照这里列出的步骤 –

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

还有一些关于解决方法的提示 –

编译在MSVC上定义的DEBUG的python模块

这是我可能遇到这个问题的其他人的步骤版本。

  1. 如果你还没有,请确保在VS中设置Python头文件和库目录

    一个。 转到工具>选项>项目和解决方案> VC ++目录 。 确保分别将include和libs路径添加到Include和Library文件的路径中。 (例如C:\Python27\includeC:\Python27\libs

  2. 转到您的Python包含文件夹(再次,例如C:\Python27\include )并编辑pyconfig.h 。 注释掉行# define Py_DEBUG并保存。 转到您的libs文件夹(例如C:\Python27\libs )并复制C:\Python27\libs 。 命名复制python27_d.lib

  3. 创建一个新的项目。 选择Win32项目并将其命名为模块名称(在我的情况pyodbc 。单击下一步然后选择应用程序类型的 DLL ,并选中空项目

  4. 在解决方案资源管理器中,右键单击头文件,然后选择添加>现有项目。 选择你需要的所有头文件。 对源文件执行相同的操作。

  5. 转到项目>属性 ,然后在配置属性

    一个。 一般 – 确保您使用正确的字符集 。 对我来说,这是Use Multi-Byte Character Set 。 Python 3可能需要Use Unicode Character Set

    调试 – 在“ 命令”字段中输入Python的路径。 (例如C:\Python27\python.exe )。 然后将附加设置为Yes

    C。 链接器>常规 – 将输出文件更改为在.pyd而不是.dll结束。

  6. 确保您的配置设置为调试。 转到生成>生成解决方案

  7. 打开cmd,然后cd进入pyd文件编译的目录。 从cmd窗口启动python。 要在运行的Python进程上附加调试器,请返回到Visual Studio,然后单击绿色的播放按钮以开始调试。 你也可以使用Debugging – > Attach to Process …现在回到Python并导入你的模块。 玩,测试,并试图打破它!

用WinDbg调试工作流程

这个工作流程将为发布版本创建调试信息,所以你不必混淆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的当前堆栈跟踪来获得详细的异常信息。 这是一个这样的输出的例子。

你应该能够把这个方法与pyrospade的答案结合起来,用Visual Studio进行调试,如果你省略了第二步并且使用Release配置构建项目。

WinDbg的进一步教程可以在这里找到。

Segfaults特别神秘,因为没有办法从Python代码中捕获它们,甚至无法在C方获得大量的堆栈跟踪信息。 有一点可以给你至少一点信息,就是在发生段错误时,使用Google breakpad C库来报告C堆栈跟踪。

您可能想尝试David Malcolm的工具CPyChecker ,它可以静态分析C扩展的内存泄漏和其他错误。 这个工具在这里被记录 。