我写了一个R包,但在运行某些操作时,它会崩溃R。这些包包括Rcpp例程,我怀疑这就是发生这种情况的地方。奇怪的是,运行相同的操作并不会一直导致崩溃。有时是,有时不是。有人对如何调试这样的问题有建议吗?我使用的是Windows 10,运行R版本4.0.5的R studio。
提前谢谢。
Writing R Extensions手册推荐了两种工具:Valgrind和AddressSanitizer
- 使用最新的Linux版本(建议使用Fedora(,例如在虚拟机中
- 安装必要的工具
- 使用valgrind仪器编译R-devel
- 编译包
- 检查可疑功能或启用valgrind的整个包装
官方手册(见上文(包含多个链接,您可以通过自己喜欢的搜索引擎找到更多链接。这里有一个例子:https://medium.com/@danielvfryer/valgrind-memcheck-with-r-a-squick-and-dirty-guide-d64567394c57
此外,SO还包含一些优秀的指南。只需搜索Valgrind,就会发现例如:如何使用Valgrind查找内存泄漏?
Bioconductor团队有一段(目前为止是经典的(视频描述了编译后的R包代码的完整调试会话——我强烈推荐它
顺便说一句,我不同意前面的答案和"Fedora推荐的"。任何带有这些工具的Linux发行版都可以,它们在Docker中也能很好地工作(我们也有Rocker(。我在R公司工作了大约25年,从未使用过Fedora。R手册通常也非常清楚,不推荐任何一个发行版,并对几个发行版进行R Core测试。第4.3.2节中的确切措辞";使用valgrind";写入R扩展手册中的
如果您可以访问通用CPU类型或支持版本的Linux在macOS或Solaris中,您可以使用"valgrind"(https://www.valgrind.org/,发音与"罐装"押韵(以检查可能的问题。(
我同意"任何系统"的建议。Windows也可以运行gdb
。
要使用valgrind
,插入是有帮助的,但不是必需的。因此,(对我来说(最简单的情况仍然是docker run --rm -ti r-base bash
,在带有R的Docker容器中打开一个bash
shell(在Debian下(,然后可以在其中安装valgrind。这仍然需要了解Linux和Docker,所以这不是一个既定的目标。
因此,回到基本问题:gdb
和print
语句可以大大缩小问题范围。与往常一样,第一步是可靠地复制问题。