我目前正在编写一个 R 包并通过以下方式使用编译的 C++ 代码Rcpp
R 中的包(对于像我这样的非程序员来说,Rcpp 使 R 和 C++ 代码的交互更容易,恕我直言)。
我想使用 gdb 调试 C++ 程序中的一些错误。我用 google 搜索了一下,主要发现了一些关于在 emacs 中调试 R 的资源,R-FAQ http://cran.r-project.org/doc/FAQ/R-FAQ.html#Should-I-run-R-from-within-Emacs_003f, 几封邮件here http://comments.gmane.org/gmane.comp.lang.r.rcpp/1436,当然还有 R 的编写 R 扩展手册。
然而,我是第一次这样做,我不能走得太远。谁能给我一些关于如何在 emacs 中调试 R 包(或 C++/C 代码扩展)的指导。具体来说,我想利用将 ESS 与 R 结合使用以及将 gdb 与 Emacs 结合使用的优势(正如 R-FAQ 中所述)。
请注意,我很了解如何使用 gdbonlyC 或 C++ 程序。但我无法将这些知识转化为使用带有 R 和扩展的 gdb。
您可以利用 RInside(Rcpp 的绝佳伴侣)将问题转化为纯 C++ 开发和调试任务,从而利用调试 C++ 程序的现有知识。
Write a 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;
}
然后像往常一样使用 gdb 调试 C++ 程序,在中设置断点function_under_test()
etc.
这样您就可以避免在 R 和 C++ 开发环境之间切换以及必须重新安装 R 包。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)