【问题标题】:How to debug an R package (with C code) in Emacs using GDB?如何使用 GDB 在 Emacs 中调试 R 包(使用 C 代码)?
【发布时间】:2011-06-26 05:17:22
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: r gdb emacs23


    【解决方案1】:

    您可以利用您现有的调试 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;
    }
    

    然后通过在function_under_test() 等中设置断点,在使用 gdb 调试 C++ 程序时照常进行。

    这样您就可以避免在 R 和 C++ 开发环境之间切换以及重新安装 R 包。

    【讨论】:

    • @user39275:C++11 支持原始字符串(由“外部”R 表示),这对于封装多行 R 语句很有用。这避免了必须手动转义换行符。
    【解决方案2】:

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

    【讨论】:

    • 谢谢。不幸的是,我是在你提到的线程中提出问题的新手(Bates 教授的问题和 Maechler 教授的回答)。 :-(。
    • 我的使用是从命令行R -d gdb,然后r 告诉gdb (r)un R,library(pkg) 然后ctrl-c 进入gdb,设置断点等。 ,即没有emacs。将符号名称和程序逻辑牢记在脑海中对我来说已经足够具有挑战性了,而不必记住 emacs / ESS 层。
    • 我认为这就是 Writing R Extensions 中的方法,不是吗?
    • 另外,我发现在没有优化和 -ggdb 调试标志的情况下构建 R 非常有帮助(R 扩展也可能暗示这一点)。在命令提示符下:CFLAGS="-ggdb" CXXFLAGS="-ggdb" FFLAGS="-ggdb" ./configure --enable-R-shlib
    猜你喜欢
    • 2014-04-24
    • 2013-01-07
    • 2013-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-20
    相关资源
    最近更新 更多