Как отладить пакет R (с кодом C) в Emacs с помощью GDB?

В настоящее время я пишу R-пакет и используя скомпилированный код С++ через пакет Rcpp в R (Rcpp упрощает взаимодействие кода R и С++ для не-программиста, подобного мне, IMHO).

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

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

Обратите внимание, что я уверен, как использовать gdb, используя только программы на C или С++. Но я не мог перевести эти знания на использование gdb с R и расширениями.

Ответы

Ответ 1

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

Запишите функцию main() С++, которая создает экземпляр R, используя RInside, выполняет R-код (или источник R script), который устанавливает тестовый пример, а затем вызывает функцию под тестом из 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, установив точки останова в function_under_test() и т.д.

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

Ответ 2

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