如何使用GDB在Emacs中调试R包(带C代码)?

时间:2011-02-12 20:59:43

标签: r gdb emacs23

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

我想使用gdb在我的C ++程序中调试一些错误。我用google搜索了一些资源,主要是在emacs,R-FAQ,一些邮件here中调试R,以及R的Writing R Extension手册。

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

请注意,我对如何使用 C或C ++程序使用gdb感到满意。但我无法将这些知识转化为使用带有R和扩展名的gdb。

2 个答案:

答案 0 :(得分:7)

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

编写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;
}

然后像往常一样通过在function_under_test()等中设置断点来调试带有gdb的C ++程序。

这样可以避免在R和C ++开发环境之间切换,并且必须重新安装R包。

答案 1 :(得分:1)

不幸的是,这并不容易。你需要在ESS,gdb(即Emacs中的gud)和R之间跳转。最好的描述可能仍然是写作R扩展,但是recent thread上有一个ESS mailing list来讨论这个(和请注意,有些回复是在线程外部进行的,因此请查看邮件列表存档。