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

sun*_*lsu 16 gdb r emacs23

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

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

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

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

Chr*_*vid 7

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

编写一个main()使用RInside创建R实例的C++函数,执行设置测试用例的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;
}
Run Code Online (Sandbox Code Playgroud)

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

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


Dir*_*tel 1

不幸的是,这并不那么容易。你需要在 ESS、gdb(即 Emacs 中的 gud)和 R 之间跳转。最好的描述可能仍然是 win 编写 R 扩展,但是ESS 邮件列表最近有一个线程也讨论了这个问题(请注意,有些回复来自在线程之外,所以也请查看邮件列表存档)。

  • 我使用的是命令行中的“R -d gdb”,然后“r”告诉gdb (r)un R,“library(pkg)”然后ctrl-c闯入gdb,设置断点等,即,没有 emacs。将符号名称和程序逻辑记在脑子里对我来说已经足够具有挑战性了,而不必记住 emacs / ESS 层。 (4认同)
  • 谢谢。不幸的是,我是新手,在你提到的帖子中提出问题(贝茨教授提出问题,梅赫勒教授回答)。:-(。 (2认同)
  • 另外,我发现在不进行优化的情况下使用 -ggdb 调试标志构建 R 非常有帮助(R 扩展也可能表明这一点)。在命令提示符下: CFLAGS="-ggdb" CXXFLAGS="-ggdb" FFLAGS="-ggdb" ./configure --enable-R-shlib (2认同)