Как разбить R?


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

5 63

5 ответов:

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

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

  • в 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").

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

авария

R пакет, который намеренно аварийно завершает сеанс R. Предупреждение: предназначен для проверки.

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

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

обработка выхода онлайн / оффлайн rstats #в одном легком шаге: options(device=function(){});plot(1) сообщенная опасность, приведет к краху вашего сеанса R. - Барри Rowlingson (@geospacedman) 16 июля

как уже упоминалось в комментарии к вашему вопросу, минимальный подход-это простой вызов системной функции 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 или inline, но тогда вам нужно иметь дело с системно-зависимыми способами компиляции, компоновки и загрузки.

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

создать файл 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...

может быть, Дирк может однострочный Rcpp-ise это?