如何使用GDB在Emacs中调试R包(带有C代码)? 我现在正在编写一个R包,并通过R(Rcpp)包中的代码> C++代码>(Rcpp使R和C++代码的交互变得更容易,对于像我这样的非程序员)来说, 我想用GDB调试我的C++程序中的几个错误。我在谷歌上搜索了一些关于在emacs中调试R的资源,一些邮件,当然还有R编写R扩展手册

如何使用GDB在Emacs中调试R包(带有C代码)? 我现在正在编写一个R包,并通过R(Rcpp)包中的代码> C++代码>(Rcpp使R和C++代码的交互变得更容易,对于像我这样的非程序员)来说, 我想用GDB调试我的C++程序中的几个错误。我在谷歌上搜索了一些关于在emacs中调试R的资源,一些邮件,当然还有R编写R扩展手册,r,gdb,emacs23,R,Gdb,Emacs23,然而,这是我第一次这样做,我不能走得太远。有谁能给我一些关于如何在emacs中调试R包(或带有C++/C代码的扩展)的建议吗。具体来说,我想利用ESS与R的结合以及gdb与Emacs的结合(正如R-FAQ所说的) 请注意,我只知道如何使用只使用C或C++程序的GDB。但我无法将这些知识转化为使用带有R和扩展的gdb。不幸的是,这并不那么容易。您需要在ESS、gdb(即Emacs中的gud)和R之间切换。最好的描述可能仍然是win编写R扩展,但是也有一篇文章讨论了这一点(请注意,一些回复来自线程之

然而,这是我第一次这样做,我不能走得太远。有谁能给我一些关于如何在emacs中调试R包(或带有C++/C代码的扩展)的建议吗。具体来说,我想利用ESS与R的结合以及gdb与Emacs的结合(正如R-FAQ所说的)


请注意,我只知道如何使用只使用C或C++程序的GDB。但我无法将这些知识转化为使用带有R和扩展的gdb。

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

你可以利用现有的调试C++程序的知识,通过使用RIN(RCPP的一个伟大的伙伴)将问题转化为纯C++开发和调试任务。p>

编写一个代码>())/Cuff> C++函数,使用RIN创建R实例,执行R代码(或源R脚本),设置测试用例,然后从主()调用函数(例如:

)。
#包括
#包括
#包括“测试中的功能”
int main(int argc,char*argv[])
{
使用名称空间std;
使用名称空间Rcpp;
漂洗液R(argc,argv);
字符串evalstr=R“(

a谢谢。不幸的是,我是在你提到的线程中问这个问题的新手(问题由贝茨教授提出,由梅奇勒教授回答):-(.我的用法是从命令行
R-d gdb
,然后
R
告诉gdb(R)un R,
库(pkg)
然后按ctrl-c键进入gdb,设置断点等,即不使用emacs。在我的脑海中保留符号名和程序逻辑对我来说是一项挑战,不需要记住emacs/ESS层。我认为这是编写R扩展的方法,不是吗?此外,我发现在没有优化的情况下使用-ggdb调试标志(R扩展可能也建议这样做)。在命令提示下:CFLAGS=“-ggdb”cxflags=“-ggdb”FFLAGS=“-ggdb”FFLAGS=“-ggdb”。/configure--enable-R-shlib@user39275:C++11支持原始字符串(由“extraneous”R表示),这对于封装多行R语句非常有用。这避免了手动转义换行符。
#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;
}