如何在Windows上调试Python的C扩展

pyr*_*ade 15 c python windows debugging gdb

我在pyodbc中遇到段错误问题,想在Windows XP x86中调试它.但是,在线信息似乎主要以Linux为中心.最好的方法是什么?

pyr*_*ade 15

所以我能够通过使用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\include,C:\Python27\libs)

  2. 转到Python包含文件夹(例如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 to Yes.

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

  6. 确保您的配置设置为Debug.转到Build> Build Solution.

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


sch*_*mar 10

使用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'])
                    ]
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)

    最后一行将下载并缓存Windows模块所需的符号.

  6. 启动Python可执行文件(Ctrl + E).您可以直接执行脚本或以交互模式运行.

  7. 使用"Go"跳过初始断点(F5).

  8. 如果存在分段错误,则执行将中断,您将 在WinDbg控制台中看到类似访问冲突的内容 - 代码c0000005(第一次机会).

  9. 您可以通过键入!analyze -v WinDbg控制台和当前堆栈跟踪来获取详细的异常信息kb. 是一个这样的输出的例子.

如果省略第二步并使用Release配置构建项目,您应该能够将此方法与pyrospade 用Visual Studio调试 的答案结合起来 .

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

  • 我发现将“/Od”添加到“extra_compile_args”以禁用优化很有用 (2认同)