繁体   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