1

通常使用 gcc,您可以使用 -g 指定调试信息的级别,如果使用 -g3,它将在可执行文件中包含预处理器宏定义,gdb 等调试器可以读取并允许您在调试期间使用。我想用 nvcc 来调试 CUDA 程序。

我目前正在修改 SDK 中的模板程序,因此我使用的是 Makefile 中包含的默认 Makefile 和 common.mk。在 'ifeq ($(dbg), 1)' 块中的 common.mk 中,我尝试了以下方法:

  • 将 -g3 放在 COMMONFLAGS 下
  • 将 -g3 放在 NVCCFLAGS 下
  • 将 -g3 放在 CXXFLAGS 和 CFLAGS 下
  • 将 --compiler-options -g3 放在 NVCCFLAGS 下。

前两个给出了一个无法识别的选项错误。后两个似乎不起作用,因为当我使用 cuda-gdb 进行调试时,我没有得到宏信息。

我想这样做的原因是因为我想使用程序本身用来访问该内存的相同宏来检查一些内存。例如,

 #define ARROW(state, arrow) ((c_arrow_t *)(&((state)->arrows) + (arrow) * sizeof(c_arrow_t)))                                                                                                  
 #define STATE(nfa, state) ((c_state_t *)(&((nfa)->states) + (state) * sizeof(c_state_t))) 

是我用来访问非确定性有限状态自动机的状态和箭头的一些宏。

谢谢您的帮助!

4

1 回答 1

1

您可能需要将 -g 都传递给 nvcc 以将其设置为使用主机调试进行构建,需要通过 -Xcompiler(或 --compiler-options)将 -g3 传递给主机编译器。

只是一个观察,但你真的不应该使用那个 SDK makefile 来做任何事情。这确实是邪恶的——对一些自动工具生成的 make 语句进行了粗暴的破解,这既不必要地复杂,也非常不灵活。甚至与我互动的 NVIDIA 开发人员也警告不要使用它。

于 2011-05-15T07:47:10.403 回答