Как отладить пакет 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, который также обсуждает это (и обратите внимание, что некоторые ответы поступают вне потока, поэтому смотрите архив рассылки тоже).