Debugging 在cuda函数中打印堆栈跟踪

Debugging 在cuda函数中打印堆栈跟踪,debugging,cuda,Debugging,Cuda,关于如何从C/C++之类的函数中打印堆栈跟踪,有几个很好的问题和答案,但这种方法在Cuda中似乎不可用。虽然我能够在C/C++中使用下面的代码段,但我无法在Cuda中使用它 __device__ void print_trace(void) { void *array[10]; size_t size; char **strings; size_t i; size = backtrace(array, 10);

关于如何从C/C++之类的函数中打印堆栈跟踪,有几个很好的问题和答案,但这种方法在Cuda中似乎不可用。虽然我能够在C/C++中使用下面的代码段,但我无法在Cuda中使用它

__device__
void print_trace(void) {
        void *array[10];
        size_t size;
        char **strings;
        size_t i;
        size = backtrace(array, 10);
        strings = backtrace_symbols(array, size);
        printf("Obtained %zd stack frames.\n", size);
        for (i = 0; i < size; i++)
                printf("%s\n", strings[i]);

        free(strings);
}

我想知道是否有人知道在Cuda中打印堆栈跟踪的方法,至少可以查看调用方函数。

原因是
backtrace()
是为在CPU(主机上)上使用而定义的函数。您不能在GPU(cuda设备)上运行此类型的函数

我过去使用过的一种调试方法是定义一个包装器,用于每次cuda调用

#define cudaErrorCheck(result) { cudaCheck((result), __FILE__, __LINE__); }
inline void cudaCheck(cudaError_t error, const char *file,
                      int line, bool abort = true) {
  if (error != cudaSuccess) {
    std::cerr << "__________CUDA_ERROR_____________" << endl;
    fprintf(stderr, "CUDA ERROR: %s %s %d\n",
            cudaGetErrorString(error), file, line);
    if (abort) {
      exit(error);
    }
  }
}

我想查看
cuda memcheck

谢谢你的回答,但这并没有回答我的问题。我需要找到堆栈跟踪,知道函数是否返回成功与此无关。好的,我编辑了答案以包含一个链接,这可能会有进一步帮助。感谢您的编辑,但正如我在问题下的另一条评论中提到的,我无法在这种情况下使用调试器。我只对打印解决方案感兴趣,或者我可以通过运行代码从函数本身获得调用函数的任何东西。设备源调试器可以打印堆栈traces@talonmies谢谢你的建议。但问题是内核是通过另一个库调用的,该库带有一个函数指针,我无法访问该库的源代码,因此我无法使用调试器。当我想单步执行该调用时,调试器会传递该调用并在该行之后停止。那么你就不走运了
#define cudaErrorCheck(result) { cudaCheck((result), __FILE__, __LINE__); }
inline void cudaCheck(cudaError_t error, const char *file,
                      int line, bool abort = true) {
  if (error != cudaSuccess) {
    std::cerr << "__________CUDA_ERROR_____________" << endl;
    fprintf(stderr, "CUDA ERROR: %s %s %d\n",
            cudaGetErrorString(error), file, line);
    if (abort) {
      exit(error);
    }
  }
}
  cudaErrorCheck(cudaMemcpy(d_a, a, size, cudaMemcpyHostToDevice));
  cudaErrorCheck(cudaMemcpy(d_b, b, size, cudaMemcpyHostToDevice));
  cudaErrorCheck(cudaDeviceSynchronize());