Как свернуть R?

Есть ли простой способ вызвать сбой в R? Это только для целей тестирования, чтобы увидеть, как определенная программа, использующая R в фоновом режиме, реагирует на сбой и помогает определить, вызваны ли какие-то редкие проблемы сбоями или нет.

Ответ 1

Самый простой способ - вызвать C -code. C предоставляет стандартную функцию abort() [1], который делает то, что вы хотите. Вам нужно позвонить: .Call("abort").

Как заметил @Phillip, вам может потребоваться загрузить libc через:

  • в Linux, dyn.load("/lib/x86_64-linux-gnu/libc.so.6") перед выпуском .Call("abort"). Конечно, путь может варьироваться в зависимости от вашей системы.

  • в OS X, dyn.load("/usr/lib/libc.dylib")

  • в Windows (я только что протестировал его на XP, так как не смог получить более новую версию). Вам нужно будет установить Rtools [2]. После этого вы должны загрузить dyn.load("C:/.../Rtools/bin/cygwin1.dll").

Ответ 2

Существует целый пакет на GitHub, посвященный этому:

авария

R, которые преднамеренно вызывают R-сеанс. ПРЕДУПРЕЖДЕНИЕ: для теста.

Как установить пакет из github рассматривается в других вопросах.

Ответ 3

Я собираюсь украсть идею у @Spacedman, но я даю ему полный концептуальный кредит, скопировав из своего канала Twitter:

Segfault #rstats за один простой шаг: options(device=function(){});plot(1)сообщила о Danger, приведет к сбою вашей сессии R. — Барри Роулингсон (@geospacedman) 16 июля 2014 года

Ответ 4

Как упоминалось в комментарии к вашему вопросу, минимальный подход - это простой вызов системной функции abort(). Один из способов сделать это в одной строке -

R> Rcpp::cppFunction('int crashMe(int ignored) { ::abort(); }'); 
R> crashMe(123)
Aborted (core dumped)
$ 

или вы можете использовать встроенный пакет:

R> library(inline)
R> crashMe <- cfunction(body="::abort();")
R> crashMe()
Aborted (core dumped)
$ 

Конечно, вы также можете сделать это за пределами Rcpp или встроенного, но тогда вам нужно иметь дело с зависящими от системы способами компиляции, связывания и загрузки.

Ответ 5

Я сделаю это на простом C, потому что мой С++ - foo не Dirkian:

Создайте файл C, segv.c:

#include <signal.h>
void crashme(){raise(SIGSEGV);}

Скомпилируйте его в командной строке (пользователям Windows придется самому это решить):

R CMD SHLIB segv.c

В R загрузите и запустите:

dyn.load("segv.so") # or possibly .dll for Windows users
.C("crashme")

Создание segfault:

> .C("crashme")

 *** caught segfault ***
address 0x1d9e, cause 'unknown'

Traceback:
 1: .C("crashme")

Possible actions:
1: abort (with core dump, if enabled)
2: normal R exit
3: exit R without saving workspace
4: exit R saving workspace
Selection: 1
aborting ...
Segmentation fault

Это то же поведение, что и то, что Томас ссылается на отчет об ошибках в графической системе, который я подал, и может быть исправлен в один прекрасный день. Однако этот двухстрочный лайнер всегда будет поднимать segfault...

Может быть, Dirk может использовать однострочный Rcpp-ise?