我目前正在编写一个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。
答案 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来讨论这个(和请注意,有些回复是在线程外部进行的,因此请查看邮件列表存档。