16

我遇到了 pyodbc中的段错误问题,想在 Windows XP x86 中对其进行调试。然而,网上的信息似乎主要以 Linux 为中心。解决此问题的最佳方法是什么?

4

4 回答 4

15

因此,我能够通过使用 Visual Studio 2008 成功解决我的问题。我大致按照此处列出的步骤进行操作 -

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

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

使用 MSVC 上定义的 DEBUG 编译 python 模块

这是我为可能遇到此问题的其他人提供的步骤版本。

  1. 如果您还没有,请务必在 VS 中设置 Python 头文件和库目录

    一种。转到工具 > 选项 > 项目和解决方案 > VC++ 目录。请务必将您的包含和库路径分别添加到包含和库文件的路径。(例如C:\Python27\includeC:\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作为Application type并选中Empty Project

  4. 在解决方案资源管理器中,右键单击 Header Files 并选择 Add > Existing Item。选择您需要的所有头文件。对源文件执行相同的操作。

  5. 转到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.

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

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

于 2012-08-01T22:23:46.657 回答
11

使用 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'to extra_compile_args'/DEBUG'to 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. 您可以通过!analyze -v 在 WinDbg 控制台中键入并使用kb. 是此类输出的示例。

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

可以在此处找到有关 WinDbg 的进一步教程。

于 2013-03-07T08:03:37.383 回答
2

段错误特别神秘,因为无法从 Python 代码中捕获它们,甚至无法在 C 端获取大量堆栈跟踪信息。至少可以为您提供更多信息的一件事是使用 Google breakpad C 库在发生段错误时报告 C 堆栈跟踪。

于 2012-07-29T23:42:06.863 回答
0

您可能想尝试使用 David Malcolm 的工具CPyChecker,该工具静态分析 C 扩展以查找内存泄漏和其他错误。该工具在此处记录

于 2014-03-23T23:58:21.990 回答