如何调试崩溃R的R包



我写了一个R包,但在运行某些操作时,它会崩溃R。这些包包括Rcpp例程,我怀疑这就是发生这种情况的地方。奇怪的是,运行相同的操作并不会一直导致崩溃。有时是,有时不是。有人对如何调试这样的问题有建议吗?我使用的是Windows 10,运行R版本4.0.5的R studio。

提前谢谢。

Writing R Extensions手册推荐了两种工具:ValgrindAddressSanitizer

  1. 使用最新的Linux版本(建议使用Fedora(,例如在虚拟机中
  2. 安装必要的工具
  3. 使用valgrind仪器编译R-devel
  4. 编译包
  5. 检查可疑功能或启用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容器中打开一个bashshell(在Debian下(,然后可以在其中安装valgrind。这仍然需要了解Linux和Docker,所以这不是一个既定的目标。

因此,回到基本问题:gdbprint语句可以大大缩小问题范围。与往常一样,第一步是可靠地复制问题。

最新更新