[英]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.