当(CUDA 7.5的)nvcc/cudafe++崩溃并出现分段错误时,我应该怎么办?

3

今天我在编译一些CUDA模板代码时,突然出现了以下错误:

nvcc foo.cu -dc -o foo.o -m64 --std c++11 -gencode arch=compute_30,code=compute_30  -I/usr/local/cuda/include  -I/path/to/includes 
Segmentation fault (core dumped)

这是在Debian Stretch上使用CUDA 7.5和GCC 4.9.3时出现的问题。Boost和CUB实际上并没有被触发段错误的代码所使用。
运行gdb,我得到了:
...
Reading symbols from /usr/local/cuda/bin/cudafe++...(no debugging symbols found)...done.
[New LWP 26725]
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Core was generated by `cudafe++ --allow_managed --m64 --gnu_version=40903 --c++11 --parse_templates --'.

Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x0000000000458b48 in ?? ()
(gdb) bt
#0  0x0000000000458b48 in ?? ()
#1  0x0000000000447989 in ?? ()
#2  0x0000000000449a77 in ?? ()
#3  0x0000000000444d6b in ?? ()
#4  0x00000000004467f1 in ?? ()
#5  0x0000000000446bd5 in ?? ()
#6  0x00000000004536e7 in ?? ()
#7  0x0000000000446c95 in ?? ()
#8  0x00000000004536e7 in ?? ()
#9  0x0000000000446c95 in ?? ()
#10 0x0000000000448403 in ?? ()
#11 0x000000000040b042 in ?? ()
#12 0x00007f3637c17610 in __libc_start_main (main=0x40af50, argc=14, argv=0x7ffd24a32058, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7ffd24a32048) at libc-start.c:291
#13 0x0000000000401769 in ?? ()
#14 0x00007ffd24a32048 in ?? ()
#15 0x000000000000001c in ?? ()
#16 0x000000000000000e in ?? ()
#17 0x00007ffd24a33e7b in ?? ()
#18 0x00007ffd24a33e84 in ?? ()
#19 0x00007ffd24a33e94 in ?? ()
#20 0x00007ffd24a33e9a in ?? ()
#21 0x00007ffd24a33eae in ?? ()
#22 0x00007ffd24a33eb6 in ?? ()
#23 0x00007ffd24a33ec8 in ?? ()
#24 0x00007ffd24a33ed3 in ?? ()
#25 0x00007ffd24a33ee5 in ?? ()
#26 0x00007ffd24a33f16 in ?? ()
#27 0x00007ffd24a33f27 in ?? ()
#28 0x00007ffd24a33f56 in ?? ()
#29 0x00007ffd24a33f6c in ?? ()
#30 0x00007ffd24a33f9b in ?? ()
#31 0x0000000000000000 in ?? ()

那样并不是很有用。我可以尝试做些什么来避免这个段错误?或者找出为什么会发生这种情况?

编辑:我刚刚注意到这个相似的问题 - 但它还没有答案。


1
@JesperJuhl:导致段错误的不是我的代码,而是nvcc(或cudafe++)...我会在适当的时候处理我的错误...哦,我想我漏掉了一行引用。现在已经修复了。 - einpoklum
2
向NVIDIA提交一个错误报告。也许尝试简化你要编译的代码,以隔离可能导致goldfish噎住的代码。 - talonmies
我曾经遇到过同样的问题。nvcc 7.0 是否会重现这个问题?对我来说,它“解决”了这个问题...如果您能够这样做,向Nvidia报告错误可能是一件好事。 - Regis Portalez
@RegisPortalez:会尝试使用CUDA 7.0并查看。 - einpoklum
在进行这个过程中,我注意到即使我注释掉 所有 已实例化的代码并只留下没有任何新实现的模板,段错误仍然会发生。 - einpoklum
@einpoklum:这并不太令人惊讶。传统上,复杂或微妙破碎的模板声明会导致C++前端要么崩溃,要么无法编译本应正确解析的代码。 - talonmies
1个回答

2

看起来崩溃的原因是未能防止using关键字的不当使用。以下是一个非最小可复现示例(稍后可能会成为最小可复现示例):

enum class foo : bool { foolish = false, snafu = true };

template <typename T> class bar {
public:
    using foo::foolish;
    using foo::snafu;
}

这是不正确的C++代码,应该会让编译器报错,但由于可能与此片段中未包含的更多代码组合的原因,这种情况并没有发生。相反,cudafe ++被欺骗接受了这个错误,变得混乱并崩溃。

如@talonmies建议的那样,将尝试向nVIDIA提交一个适当的错误报告...

编辑:现在很难复制 :-(


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接