从 cuda-memcheck 的输出中跟踪函数名称
Trace for function name from the output of cuda-memcheck
我运行cuda-memcheck
调试我的代码,输出如下
========= Program hit cudaErrorCudartUnloading (error 29) due to "driver shutting down" on CUDA API call to cudaFree.
========= Saved host backtrace up to driver entry point at error
========= Host Frame:/usr/lib/x86_64-linux-gnu/libcuda.so.1 [0x2e40d3]
========= Host Frame:./nmt [0x53526]
========= Host Frame:./nmt [0xfbd9]
terminate called after throwing an instance of '========= Host Frame:/lib/x86_64-linux-gnu/libc.so.6 [0x3c259]
========= Host Frame:/lib/x86_64-linux-gnu/libc.so.6 [0x3c2a5]
========= Host Frame:/lib/x86_64-linux-gnu/libc.so.6 (__libc_start_main + 0xfc) [0x21ecc]
thrust::system::system_error'
========= Host Frame:./nmt [0x530a]
=========
what(): driver shutting down
========= Error: process didn't terminate successfully
========= Internal error (20)
========= No CUDA-MEMCHECK results found
是否可以从 Host Frame:./nmt [0x53526]
行看出代码中哪里出了问题?如果可以,我该怎么做?
正如@talonmies 指出的(我怀疑他不会介意我 post CW 回答),cuda-memcheck
工具提供了额外的堆栈回溯跟踪功能,可以通过 --show-backtrace
开关添加到命令行。
回溯可能包括主机和设备功能(即主机和设备回溯)
如果应用程序还使用主机调试符号信息进行编译(例如 linux 上的 -g
),则 cuda-memcheck
可以在主机回溯中显示主机函数的函数名称。
documentation 中提供了其他使用信息。
对我来说 cuda-memcheck
使用不同的子工具,例如 memcheck
、racecheck
、initcheck
和 synccheck
通常会生成没有行号的主机回溯甚至没有提到的主机功能。在互联网上搜索只显示了这个问题,但我已经将 -g
甚至 -g3
传递给主机编译器,并且 --show-backtrace
标志到 cuda-memcheck
在文档中说是yes
默认情况下(显式传递它没有帮助)。所以我对回溯执行以下操作:
考虑你的编译程序被称为 a.out
并且你在主机回溯中得到一行 Host Frame:./nmt [0x530a]
。然后在 cuda-gdb
中打开你的程序:
cuda-gdb a.out
然后,让您的程序加载所有共享库(至少到 main()
函数中的某个点)。在 cuda-gdb
提示符中输入以下内容:
b main
r
然后,查找函数名称:
info symbol 0x530a
或查找行号:
info line *0x530a
其中 0x530a
是为您打印的地址 cuda-memcheck
。我想 NVIDIA 可以很容易地自动执行此操作(以及在打印主机函数名称的地方对其进行分解)。
我运行cuda-memcheck
调试我的代码,输出如下
========= Program hit cudaErrorCudartUnloading (error 29) due to "driver shutting down" on CUDA API call to cudaFree.
========= Saved host backtrace up to driver entry point at error
========= Host Frame:/usr/lib/x86_64-linux-gnu/libcuda.so.1 [0x2e40d3]
========= Host Frame:./nmt [0x53526]
========= Host Frame:./nmt [0xfbd9]
terminate called after throwing an instance of '========= Host Frame:/lib/x86_64-linux-gnu/libc.so.6 [0x3c259]
========= Host Frame:/lib/x86_64-linux-gnu/libc.so.6 [0x3c2a5]
========= Host Frame:/lib/x86_64-linux-gnu/libc.so.6 (__libc_start_main + 0xfc) [0x21ecc]
thrust::system::system_error'
========= Host Frame:./nmt [0x530a]
=========
what(): driver shutting down
========= Error: process didn't terminate successfully
========= Internal error (20)
========= No CUDA-MEMCHECK results found
是否可以从 Host Frame:./nmt [0x53526]
行看出代码中哪里出了问题?如果可以,我该怎么做?
正如@talonmies 指出的(我怀疑他不会介意我 post CW 回答),cuda-memcheck
工具提供了额外的堆栈回溯跟踪功能,可以通过 --show-backtrace
开关添加到命令行。
回溯可能包括主机和设备功能(即主机和设备回溯)
如果应用程序还使用主机调试符号信息进行编译(例如 linux 上的 -g
),则 cuda-memcheck
可以在主机回溯中显示主机函数的函数名称。
documentation 中提供了其他使用信息。
对我来说 cuda-memcheck
使用不同的子工具,例如 memcheck
、racecheck
、initcheck
和 synccheck
通常会生成没有行号的主机回溯甚至没有提到的主机功能。在互联网上搜索只显示了这个问题,但我已经将 -g
甚至 -g3
传递给主机编译器,并且 --show-backtrace
标志到 cuda-memcheck
在文档中说是yes
默认情况下(显式传递它没有帮助)。所以我对回溯执行以下操作:
考虑你的编译程序被称为 a.out
并且你在主机回溯中得到一行 Host Frame:./nmt [0x530a]
。然后在 cuda-gdb
中打开你的程序:
cuda-gdb a.out
然后,让您的程序加载所有共享库(至少到 main()
函数中的某个点)。在 cuda-gdb
提示符中输入以下内容:
b main
r
然后,查找函数名称:
info symbol 0x530a
或查找行号:
info line *0x530a
其中 0x530a
是为您打印的地址 cuda-memcheck
。我想 NVIDIA 可以很容易地自动执行此操作(以及在打印主机函数名称的地方对其进行分解)。