为何compute-sanitizer未按预期报告代码行信息?
CUDA越界访问调试:无法获取源代码行信息的原因与解决办法
问题场景
为RTX2060开发的CUDA C/C++应用在调试阶段,使用compute-sanitizer检测到越界访问错误,输出如下:
Starting iteration 0 Evolving fluid interior and boundary ========= Invalid __global__ read of size 4 bytes ========= at FluidAdvance(float *, float *, float *, float *, float *, float *, float *, float *, const float *, const float *, const float *, const float *, const float *, const float *, const float *, const float *, float *, float *, float *, float *, float *, float *, float *, float *, float, float, float, float, float, int, int, int)+0xfc50 ========= by thread (0,2,0) in block (0,0,0) ========= Address 0x74fafcffc110 is out of bounds ========= and is 16,112 bytes before the nearest allocation at 0x74fafd000000 of size 1,048,576 bytes ========= Saved host backtrace up to driver entry point at kernel launch time
为定位错误对应的源代码行,在CMakeLists.txt中为主可执行目标imhd-debug添加了CUDA编译选项:
target_compile_options(imhd-debug PRIVATE $<$<COMPILE_LANGUAGE:CUDA>: -v -g -lineinfo >)
但重新构建后运行compute-sanitizer,仍未显示源代码行信息。
原因分析
触发越界访问的FluidAdvance函数定义在独立的库目标中,而非主可执行目标imhd-debug内部。添加的-g(生成调试信息)和-lineinfo(生成CUDA内核行号信息)仅作用于主可执行文件,库目标未生成对应的调试符号,导致compute-sanitizer无法将错误地址映射到源代码行。
解决办法
找到定义FluidAdvance函数的库目标,为该库添加相同的CUDA编译选项:
# 替换为实际的库目标名称 target_compile_options(your-library-target PRIVATE $<$<COMPILE_LANGUAGE:CUDA>: -g -lineinfo >)
重新构建整个项目后,再次运行compute-sanitizer即可获取错误对应的源代码行信息。
内容的提问来源于stack exchange,提问作者Ashamandarei
相关产品推荐
相关产品推荐

