Python PyOpenCl:如何调试分段错误?

Python PyOpenCl:如何调试分段错误?,python,debugging,segmentation-fault,opencl,pyopencl,Python,Debugging,Segmentation Fault,Opencl,Pyopencl,我有PyOpenCL代码和openclc内核代码。当我运行我的应用程序时,我捕捉到分段错误。如何使用调试器或其他开发工具调试此类错误?我不知道该怎么做才能找出问题所在。我想用printf之类的东西来选择,但我想用更强大的东西 我相信内核代码中存在这个错误,所以我想首先调试内核代码 UPD。我使用的是linux(Arch linux,3.6.11)、python 2或3、PyOpenCl 2012.1如果不全面测试您的软件套件,我不会得出结论。您正在运行的是最新发布的版本。很有可能您正在向模块传递

我有PyOpenCL代码和openclc内核代码。当我运行我的应用程序时,我捕捉到分段错误。如何使用调试器或其他开发工具调试此类错误?我不知道该怎么做才能找出问题所在。我想用
printf
之类的东西来选择,但我想用更强大的东西

我相信内核代码中存在这个错误,所以我想首先调试内核代码


UPD。我使用的是linux(Arch linux,3.6.11)、python 2或3、PyOpenCl 2012.1

如果不全面测试您的软件套件,我不会得出结论。您正在运行的是最新发布的版本。很有可能您正在向模块传递未正确填充的内容,并且后端模块在使用未正确填充的内容之前未执行必要的错误检查(如果没有任何代码可用,则无法真正帮助您进行调试)


您是否尝试过在不同的pyopencl调用之前使用设置不同的断点(
import pdb;pdb.set_trace()
),以查看代码中的seg错误?这绝对应该是你的第一项任务。当您发现seg错误的位置时,您需要仔细查看pyopencl示例/api以了解出错的原因

内核调试依赖于实现。在Linux上,我发现最好的方法是在CPU上使用AMD的CL实现,用-g编译内核,然后使用gdb。他们的编程指南中有关于这方面的说明,如下所示:


如果您使用的是nvidia而不是ATI/AMD GPU,则nvidia SDK中的OpenCL支持……低于预期

英特尔为他们最近的处理器提供了一个基于CPU的OpenCL SDK,请参阅--(要使用他们在Ubuntu上提供的RPM软件包,您需要在每个软件包上运行“fakeroot alien--to deb”,然后运行“dpkg-i”)

使用该SDK,您需要将“-g”和“-s filename”标志添加到build()中的编译器选项中。(如果您的内核在程序中仅以字符串形式存在,您可以在运行它之前添加代码将其保存到文件中。)然后尝试“gdb--args python cmd”,您可以通过键入“break mykernel”开始调试,当询问您是否要等待“mykernel”符号动态加载时,回答Y,然后键入“run”


在手动键入命令运行调试器之后,我建议创建一个可执行的shell脚本,用调试器启动您最喜欢的.py文件(这也是一个方便的地方,可以将黑客添加到应用程序的启动中,例如python-m unittest、PYTHONPATH、virtualenv、LD_LIBRARY_PATH、LD_PRELOAD等).

分段错误通常是由于内核内存访问错误造成的。有一个很酷的工具可以检测坏内存访问,类似于valgrind:。与内核代码中的一些printf相结合,它使定位问题变得更加容易。

如果您描述您的环境、操作系统、版本、发行版等,可能会有所帮助。我添加了您要求的信息,但我想知道独立于特定版本的pyopencl或python版本调试pyopencl项目的一般方法。我不希望解决方案特定于python或pyopencl版本(尽管问题可能特定于您的pyopencl版本),但用于调试seg故障的较低级别工具在Linux、BSD、OS X和Windows之间有所不同。如果您还没有,您应该查看此类似问题的答案:。祝你好运。谢谢,我将尝试纯python调试,但我确信应该存在一些特定的东西,比如python的gDEBugger()位,或者与pyopenclI使用的pdb一起使用它的一些技巧,我确信原因是我的内核代码。我想调试内核代码,但我不知道如何调试。