如何调试分段错误?

2024-03-29 11:02:58 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我相信内核代码中的错误,所以我想首先调试内核代码。在

升级版。我使用的是linux(ArchLinux,3.6.11)、Python2或3、PyOpenCl 2012.1


Tags: 代码pyopencl应用程序linux选项错误内核调试器
3条回答

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

AMD CL Documentation page

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

您是否尝试过在不同的pyopencl调用之前使用python debugger来设置不同的断点(import pdb; pdb.set_trace()),甚至可以查看代码中的seg错误在哪里?这绝对是你的第一个任务。当您找到seg错误的位置时,您需要仔细查看pyopencl示例/api,以了解出错的原因。在

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

Intel为他们最近的处理器提供了一个基于CPU的OpenCL SDK,请参见http://software.intel.com/en-us/vcsource/tools/opencl-sdk-2013--(要使用他们在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等)。在

相关问题 更多 >