Tutorial: Debugging with Intel® Distribution for GDB*

Troubleshooting

Template Operators Cannot Be Found

The compiler omits the code of a template class method if that method is not used in the code. This is a C++ issue and may cause inconvenience when you want to invoke the omitted function. This issue is seen in DPC++ because the basic classes (range, id, nd_range, accessor, and others) are templates that have several overloaded operators. Examples:

As a solution, you can explicitly instantiate a template class in your source. Then the methods of the template instance are available in the binary. The instantiations can be surrounded with #ifndef NDEBUG and #endif to avoid code bloat in release builds. Example:

#ifndef NDEBUG

template class cl::sycl::id<1>;
template class cl::sycl::id<2>;
template class cl::sycl::id<3>;
template class cl::sycl::range<1>;
template class cl::sycl::nd_range<1>;

#endif // #ifndef NDEBUG

Accessor Operator [] Cannot Be Resolved

Elements of an accessor object cannot be accessed using the multi-dimensional access syntax during expression evaluation. See example below:

print anAccessor[5][3][4]
Example output:
Cannot resolve function operator[] to any overloaded instance

Instead, use an id object:

Kernel Stops Responding

If the kernel that is offloaded to a GPU stops responding:

  1. Check whether there are any stray `gdbserver-gt` processes running in the background:
    ps -u $USER | grep gdbserver-gt
  2. Stop background `gdbserver-gt` processes, if there are any:
    killall -9 gdbserver-gt

Breakpoint Is Not Hit