You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 12:03:12