2011-02-12 50 views
13

我目前正在编写一个R包,并通过R中的Rcpp包使用编译的C++代码(Rcpp使像我这样的非程序员更容易实现R和C++代码的交互,恕我直言)。如何使用GDB在Emacs中调试R包(使用C代码)?

我想使用gdb在我的C++程序中调试一些错误。我搜索了一下,主要发现了一些在emacs中调试R的资源,R-FAQ,一些邮件here,绝对是R的写作R扩展手册。

但是,我这样做是第一次,我不能走得太远。任何人都可以给我一些关于如何在emacs中调试R包(或带有C++/C代码的扩展)的指针。具体来说,我想利用ESS与R和gdb一起使用Emacs(就像R-FAQ谈到的那样)。

请注意,我确定如何使用gdb只使用 C或C++程序。但是我不能将这些知识转化为使用带有R和扩展的gdb。

回答

1

不幸的是,这并不容易。您需要在ESS,gdb(即Emacs中的gud)和R之间跳转。最好的描述可能仍然是赢得Writing R Extensions,然而ESS mailing list上有recent thread也讨论过这个问题(并注意到一些回复是在线程所以也请看邮件列表档案)。

+1

谢谢。不幸的是,我是新手在你提到的主题(由贝茨教授提问并由Maechler教授回答)中提出这个问题。 :-(。 – suncoolsu 2011-02-12 23:14:51

+1

我的用法是从命令行输入`R -d gdb`,然后用`r`告诉gdb(r)un R,`library(pkg)`,然后ctrl-c进入gdb,设置断点等等,也就是说,没有emacs。在我脑海中保留符号名称和程序逻辑对我来说足够具有挑战性,而不必记住emacs/ESS层。 – 2011-02-12 23:24:11

6

您可以利用您现有的调试C++程序的知识,将问题转化为纯粹的C++开发和调试任务,使用RInside(Rcpp的一个很好的伴侣)。

编写一个main() C++函数,该函数使用RInside创建一个R实例,执行设置测试用例的R代码(或源代码R脚本),然后从main()中调用被测试的函数。

#include <Rcpp.h> 
#include <RInside.h> 
#include "function_under_test.h" 

int main(int argc, char *argv[]) 
{ 
    using namespace std; 
    using namespace Rcpp; 

    RInside R(argc, argv); 

    string evalstr = R"(
     a <- matrix(c(1,1,1, 1,1,1, 1,1,1), nrow = 3, ncol=3) 
    )"; 
    R.parseEvalQ(evalstr); 

    SEXP a = R["a"]; 

    R["b"] = function_under_test(a); 

    evalstr = R"(
     print(b) 
    )"; 
    R.parseEvalQ(evalstr); 

    return 0; 
} 

用gdb通过设置断点在function_under_test()

这样你避免R和C++开发环境之间进行切换调试C++程序,并且具有重新安装将R包时然后继续照常进行。