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