什么是有效的方法来调试R中加载的Rcpp编译代码(在OS X Mavericks上)?

FXQ*_*der 29 debugging r rcpp rstudio osx-mavericks

调试加载到R中的共享对象的最有效和最快捷的方法是什么,特别是在OS X Mavericks上?我主要对调试编译的Rcpp代码感兴趣.

我已经阅读了关于调试编译代码的R外部代码(http://cran.r-project.org/doc/manuals/R-exts.html#Debugging-compiled-code),这有利于使用gdb,但是gdb不是正式的小牛队支持.但是,似乎lldb是一个可行的替代方案吗?我找到了最有用的资源,用于研究如何在Dirk对此帖子的回复中调试R中的编译代码(Thanks Dirk!)(在Windows下调试(逐行)Rcpp生成的DLL).

我可以通过按照下面逐步明确的步骤来成功调试已编译的Rcpp代码,其他Rcpp新手可能会觉得这很有用(道歉的长度,但我认为最好是明确而不是省略和模糊).但是这个开发过程有点繁琐且耗时.

问题:

  1. 与我在下面的操作相比,是否有更快速和/或更简单的方法来调试已编译的Rcpp代码?

  2. 我是Rstudio的忠实粉丝,并且很乐意合并从该IDE创建的调试共享对象,所以如果有人知道如何做到这一点,我会有兴趣知道吗?Rstudio似乎使用属性,看起来下面的步骤4需要修改,因为编译后在临时目录中似乎没有.cpp文件(在我的示例中,没有"file5156292c0b48.cpp"文件)

步骤:

1)(一次性)转到〜/ .R目录(带有.的隐藏目录).创建一个名为"Makevars"的新文件,然后在其中添加该行CXXFLAGS=-g -O0 -Wall.

2)在终端中,键入R -d lldb以启动R. lldb现在将启动.

3)run在lldb命令行输入.这将启动R.

4)编译Rcpp代码并找到编译对象的位置.德克对上述帖子的回应显示了一种方法.这是我将在这里使用的一个例子.在R中运行以下命令:

library(inline)

fun <- cxxfunction(signature(), plugin="Rcpp", verbose=TRUE, body='
int theAnswer = 1;
int theAnswer2 = 2;
int theAnswer3 = 3;
double theAnswer4 = 4.5;
return wrap(theAnswer4);
')
Run Code Online (Sandbox Code Playgroud)

这将创建一个编译的共享对象和其他文件,可以通过在R中运行setwd(tempdir())和list.files()来找到.将有一个.cpp文件,如"file5156292c0b48.cpp"和.so文件,如" file5156292c0b48.so"

5)通过dyn.load("file5156292c0b48.so")在R命令行运行将共享对象加载到R中

6)现在我们要调试这个.so对象中的C++代码.点击回到lldb ctrl + c.现在我想在file5156292c0b48.cpp文件中的特定行设置一个断点.我通过打开另一个终端并查看file5156292c0b48.cpp中感兴趣的行号来找到正确的行号.假设它是第31行,它对应于theAnswer = 1中的行; 以上在我的例子中.然后我在lldb命令行输入:breakpoint set -f file5156292c0b48.cpp -l 31.调试器打印回来已设置断点和其他一些东西......

7)通过cont在lldb中运行返回到R (在我按下回车之前,R提示不会自动出现)并调用该函数.fun()在R命令行运行.现在我正在调试共享对象(点击n转到下一行,p [对象名]打印变量等)....

Rom*_*ois 11

要调试这样的简单Rcpp脚本,你可以做的一件事是创建一个.cpp嵌入R 的应用程序(带有一个main).这样你就可以直接使用Xcode调试它,这将为你提供良好的调试体验.

当您开始想要调试包时,它会变得更加复杂.

  • 你能写出如何实际做到这一步的步骤吗?假设我没有c ++的先验知识? (13认同)
  • 只是老派`Rf_PrintValue`和'Rprintf`叫我害怕. (10认同)
  • @RomainFrancois这个qn似乎引起了一些兴趣.您是否可以概述使用Xcode以最小的示例调试Rcpp代码的步骤(如Selva所述)?(我仍然只是从命令行调试idk如何用Xcode调试rcpp代码).如果你在这里提供了另一个答案,我打赌你会从别人那里得到许多+ 1;) (10认同)
  • 对于如何使用Xcode进行调试,我还要+1. (6认同)
  • @roman所以你如何调试包. (5认同)
  • @RomainFrancois我们可以采取更多步骤吗? (2认同)

Jac*_*sey 5

这很难。我尝试使用独立的 C++ 应用程序使用 Xcode 和 Eclipse,但让所有标头和库正常工作非常困难。此外,RcppExport 代码通过指针调用真正的 R 函数,这似乎确实让 Xcode 感到困惑,而且我无法进入我的函数。

我最终得到(gdb或lldb):在R中: R -d lldb 在调试器中,设置断点: b functionName run 在R中: .Call(etc) # or just call your R code which invokes compiled C/C++ code 然后在发生中断后返回调试器,您可以单步执行,检查帧等。

这个 lldb/gdb命令快速参考很有帮助。

此时忘记尝试在 GUI 中执行此操作。希望 Rstudio 能够实现这一目标。