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