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