Есть ли простой способ вызвать сбой в 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?