16

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

我想使用 gdb 调试我的 C++ 程序中的一些错误。我在 Google 上搜索并主要发现了一些关于在 emacs 中调试 R 的资源、R-FAQ、一些邮件这里,当然还有 R 的编写 R 扩展手册。

但是,我是第一次这样做,我不能走得太远。谁能给我一些关于如何在 emacs 中调试 R 包(或使用 C++/C 代码的扩展)的指示。具体来说,我想利用 ESS 和 R 以及 gdb 和 Emacs(正如 R-FAQ 所讨论的那样)。

请注意,我可以使用C 或 C++ 程序来使用 gdb。但我无法将这些知识转化为将 gdb 与 R 和扩展一起使用。

4

2 回答 2

7

您可以利用您现有的调试 C++ 程序的知识,通过使用 RInside(Rcpp 的一个很好的伴侣)将问题转化为纯 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;
}

然后在使用 gdb 调试 C++ 程序时像往常一样通过在function_under_test()etc中设置断点来进行。

通过这种方式,您可以避免在 R 和 C++ 开发环境之间切换,并且不必重新安装 R 包。

于 2012-11-07T09:32:33.763 回答
1

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

于 2011-02-12T23:03:46.163 回答