Как отладить пакет R (с кодом C) в Emacs, используя GDB?

В настоящее время я пишу пакет R и использую скомпилированный код C++ через Rcpp package in R (Rcpp облегчает взаимодействие кода R и C++ для такого непрограммиста, как я, ИМХО).

Я хочу отладить несколько ошибок в моей программе на C++ с использованием gdb. Я погуглил и нашел в основном несколько ресурсов по отладке R в emacs, R-FAQ, несколько писем здесь и определенно Руководство по расширению R Writing R.

Однако я делаю это впервые, я не мог зайти слишком далеко. Может ли кто-нибудь дать мне несколько советов о том, как отлаживать пакеты R (или расширения с кодом C++/C) в emacs. В частности, я хочу воспользоваться преимуществами использования ESS с R и GDB с Emacs (о чем говорит R-FAQ).

Пожалуйста, обратите внимание, я в порядке, как использовать GDB, используя только программы на C или C++. Но я не смог перевести это знание на использование gdb с R и расширениями.

2 ответа

Вы можете использовать имеющиеся у вас знания по отладке программ на C++, превратив проблему в чисто задачу разработки и отладки на C++ с помощью RInside (отличный компаньон Rcpp).

Напиши main() Функция C++, которая создает экземпляр R с использованием RInside, выполняет код 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;
}

Затем продолжите как обычно при отладке программы на C++ с помощью gdb, установив точки останова в function_under_test() и т.п.

Таким образом вы избегаете переключения между средами разработки R и C++ и необходимости переустанавливать пакет R.

К сожалению, не все так просто. Вам нужно переключиться между ESS, gdb (то есть gud в Emacs) и R. Лучшее описание, вероятно, все еще выигрывает Writing R Extensions, однако в списке рассылки ESS недавно была тема, в которой это тоже обсуждается (и обратите внимание, что некоторые ответы пришли во внешней ветке, так что посмотрите на архив списка рассылки тоже).

Другие вопросы по тегам