如何使用 GDB 在 Emacs 中调试 R 包(带有 C 代码)?

发布于 2024-10-16 21:44:08 字数 605 浏览 3 评论 0原文

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

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

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

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

I am currently writing an R package and using compiled C++ code through the Rcpp package in R (Rcpp makes the interaction of R and C++ code easier for a non-programmer like me, IMHO).

I want to debug a few errors in my C++ program using gdb. I have googled and found mainly a few resources on debugging R within emacs, R-FAQ, a few mails here, and definitely the R's Writing R Extension Manual.

However, I am doing this for the first time, I could not go too far. Could anyone give me a few pointers on how to debug R packages (or extensions with C++/C code) within emacs. Specifically, I want to take advantages of using ESS with R and gdb with Emacs (as the R-FAQ talks about).

Please note, I am ok on how to use gdb using only C or C++ programs. But I could not translate this knowledge to using gdb with R and extensions.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

国粹 2024-10-23 21:44:08

您可以利用 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;
}

然后像往常一样使用 gdb 调试 C++ 程序,通过在 function_under_test() 等中设置断点等。

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

You can leverage your existing knowledge of debugging C++ programs by turning the problem into a pure C++ development and debugging task using RInside (a great companion to Rcpp).

Write a main() C++ function that creates an R instance using RInside, executes R code (or sources an R script) that sets up the test case, and then call the function under test from main(), e.g.

#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;
}

Then proceed as usual when debugging a C++ program with gdb by setting breakpoints in function_under_test() etc.

This way you avoid switching between R and C++ development environments and having to re-install the R package.

ζ澈沫 2024-10-23 21:44:08

不幸的是,这并不那么容易。你需要在 ESS、gdb(即 Emacs 中的 gud)和 R 之间跳转。最好的描述可能仍然是 win 编写 R 扩展,但是有一个 上的最新帖子 ESS 邮件列表 也讨论了这个问题(请注意,一些回复来自线程之外,因此也请查看邮件列表存档)。

It's not all that easy, unfortunately. You need to jump between ESS, gdb (ie gud in Emacs) and R. The best description is probably still win Writing R Extensions, however there was a recent thread on the ESS mailing list that discusses this too (and note that some replies came in outside the thread so do look at the mailing list archive too).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文