我遇到了 pyodbc中的段错误问题,想在 Windows XP x86 中对其进行调试。然而,网上的信息似乎主要以 Linux 为中心。解决此问题的最佳方法是什么?
4 回答
因此,我能够通过使用 Visual Studio 2008 成功解决我的问题。我大致按照此处列出的步骤进行操作 -
http://www.velocityreviews.com/forums/t329214-debugging-python-extensions.html
还有一些关于解决方法的提示 -
使用 MSVC 上定义的 DEBUG 编译 python 模块
这是我为可能遇到此问题的其他人提供的步骤版本。
如果您还没有,请务必在 VS 中设置 Python 头文件和库目录
一种。转到工具 > 选项 > 项目和解决方案 > VC++ 目录。请务必将您的包含和库路径分别添加到包含和库文件的路径。(例如
C:\Python27\include
,C:\Python27\libs
)转到您的 Python 包含文件夹(再次,例如
C:\Python27\include
)并编辑pyconfig.h
. 注释掉该行# define Py_DEBUG
并保存。转到您的 libs 文件夹(例如C:\Python27\libs
)并制作python27.lib
. 为副本命名python27_d.lib
。创建一个新项目。选择Win32 Project并将其命名为模块名称(在我的情况下
pyodbc
。单击Next然后选择DLL作为Application type并选中Empty Project。在解决方案资源管理器中,右键单击 Header Files 并选择 Add > Existing Item。选择您需要的所有头文件。对源文件执行相同的操作。
转到Project > Properties,然后在Configuration Properties下-
一种。一般- 确保您使用正确的字符集。对我来说是
Use Multi-Byte Character Set
。Python 3 可能需要Use Unicode Character Set
.湾。调试- 在命令字段中输入 Python 的路径。(例如
C:\Python27\python.exe
)。然后将附加设置为Yes
。C。Linker > General - 将输出文件更改为以结尾
.pyd
而不是.dll
.确保您的配置设置为调试。转到构建 > 构建解决方案。
打开 cmd 并
cd
进入pyd
编译文件的目录。从 cmd 窗口启动 python。要在这个正在运行的 python 进程上附加调试器,请返回 Visual Studio 并单击绿色播放按钮开始调试。你也可以使用 Debugging -> Attach to Process... 现在回到 Python 并导入你的模块。玩,测试,并尝试打破它!
使用 WinDbg 调试工作流
此工作流程将为发布版本创建调试信息,因此您不必弄乱 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'
toextra_compile_args
和'/DEBUG'
toextra_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(第一次机会)的内容。
您可以通过
!analyze -v
在 WinDbg 控制台中键入并使用kb
. 这是此类输出的示例。
如果您省略他的第二步并使用 发布配置构建项目,您应该能够将此方法与 pyrospade 使用 Visual Studio 调试的 答案结合起来。
可以在此处找到有关 WinDbg 的进一步教程。
段错误特别神秘,因为无法从 Python 代码中捕获它们,甚至无法在 C 端获取大量堆栈跟踪信息。至少可以为您提供更多信息的一件事是使用 Google breakpad C 库在发生段错误时报告 C 堆栈跟踪。
您可能想尝试使用 David Malcolm 的工具CPyChecker
,该工具静态分析 C 扩展以查找内存泄漏和其他错误。该工具在此处记录。