如何使用cuda-gdb调试调用CUDA函数的Python代码?
调试调用CUDA函数的Python代码方法
先说明你当前报错的原因
你用 cuda-gdb python3 hello.py 出现报错,本质是用错了工具的使用方式:
cuda-gdb是用来调试编译后的CUDA二进制程序(比如CUDA C/C++生成的可执行文件、.so库)的,没法直接调试Python脚本这种解释型文件。- 你的Python解释器没有编译调试符号,所以会提示
No debugging symbols found in python3。 - 脚本文件本身不是core dump格式,自然会被识别为格式错误。
不同场景的调试方案
场景1:用PyCUDA/CUDA Python这类高层库调用CUDA
如果你的代码是用PyCUDA、NVIDIA官方CUDA Python这类库直接写CUDA逻辑,按下面步骤来:
- 先确保Python带调试符号
要么从源码编译Python时加--with-debug参数,要么装带调试符号的包(比如Debian/Ubuntu下装python3-dbg)。 - 用cuda-gdb正确启动Python并加载脚本
别直接把脚本当参数传给cuda-gdb,正确命令是:# 方式1:直接指定运行脚本 cuda-gdb --args python3 hello.py # 方式2:先启动cuda-gdb再运行脚本 cuda-gdb python3 # 进入cuda-gdb后执行 (cuda-gdb) run hello.py - 调试CUDA核函数
要调试GPU上的核函数,编译核函数时必须加调试参数:- 比如PyCUDA中编译核函数要加
-G和-g:from pycuda.compiler import SourceModule mod = SourceModule(""" __global__ void my_cuda_kernel() { // 你的核函数代码 } """, options=["-G", "-g"]) - 然后在cuda-gdb里给核函数设断点:
(cuda-gdb) break my_cuda_kernel (cuda-gdb) run hello.py
step、print这些cuda-gdb命令调试GPU代码了。 - 比如PyCUDA中编译核函数要加
场景2:调用自己编译的CUDA扩展库
如果你的Python代码调用的是自己写的CUDA C/C++扩展(比如用setuptools编译的.so文件),调试步骤:
- 编译扩展时加调试信息
在setup.py里给nvcc和C++编译器加调试参数,以PyTorch扩展为例:from setuptools import setup from torch.utils.cpp_extension import CUDAExtension, BuildExtension setup( name='my_cuda_ext', ext_modules=[ CUDAExtension('my_cuda_ext', sources=['ext_main.cpp', 'cuda_kernel.cu'], extra_compile_args={'cxx': ['-g'], 'nvcc': ['-G', '-g']}) ], cmdclass={'build_ext': BuildExtension} ) - 用cuda-gdb启动调试
同样用cuda-gdb --args python3 hello.py启动,然后给扩展里的CUDA函数设断点:
触发核函数调用后就可以调试GPU代码了。(cuda-gdb) break my_cuda_kernel # 替换成你的核函数名 (cuda-gdb) run
实用调试小技巧
- 用
info cuda threads查看当前GPU线程的状态信息。 - 查看GPU变量时,可以指定线程上下文,比如
print threadIdx.x查看当前线程的x索引。 - 如果同时要调试Python代码逻辑,可以在Python代码里插
import pdb; pdb.set_trace(),当程序停在pdb断点时,切换到cuda-gdb窗口设置GPU断点,再继续运行。
内容的提问来源于stack exchange,提问作者thanksarose
相关产品推荐
相关产品推荐

